python爬虫入门训练-1

序言

在掌握了python基本语法之后,便想继续学习一些python分支的一些东西练练手,便想到了python的爬虫,本文几乎只介绍了最基础的python爬虫案例,对网站文档、照片、视频的爬取,文档部分是对一个小说网站比趣看,对小说武神风暴全章的爬取,图片部分是对彼岸桌面壁纸的爬取,这些例子让大家对python爬虫流程有一个简单的了解,文章还穿插介绍了一些十分基础的知识,文章有很多print的部分,都被我注释了,大家一步一步走的话,可以每一步都print一下,保证正确率,建议大家先把代码复制一遍,运行成功了,再回头看文章,因为可能网站更新,该篇文章不在适用,不能用了,私聊一下,我再更新

运用知识

requests库,正则表达式,os模块处理文件

正文

网站源码获取

requests库的导入

  • 进入pycharm
  • 点击File
  • 点击Setting
  • 点击Project “你的项目名字”
  • 点击Project interpreter
  • 点击右上角的“+”号
  • 搜索requests,install package

每次新建项目都需要重新重新导入库,解决办法
第一个办法可以使用,点击show All…更换到原来解释器路径就行了

代码部分

import requests 
# 导入requests库
url="https://www.biqukan.com/7_7685/" 
# 要爬取网站的域名,即网址
response=requests.get(url); 
# 对网站发送get请求,会返回一个http状态码
response.encoding='gbk'
# 设置编码格式,不调整的话,得到的text文本,会出现乱码
html=response.text
# 把获得的网站源代码以文本形式存储在变量html中
# print(html)

关于编码格式的设置,一般按F12查看网页源代码时,在head栏,前几行有charset=’ ',本次爬取的网站为charset=‘gbk’,所以在设置encoding时,为gbk
你把变量html,print一下,就可以看到该页面的源代码啦,下面我们需要从这乱乱的代码中,找出我们需要的部分
在这里插入图片描述

数据提取

正则表达式

本文对数据的提取基于正则表达式,正则表达式用于在复杂文本信息中筛选出自己需要的信息,在多种语言中均有运用,本文只用到了一丢丢,故不详细介绍,推荐正则表达式学习视频

代码部分

import re
# 导入正则的库
title=re.findall(r'<meta property="og:title" content="(.*?)"/>',html)[0]
# 在网页源代码中分析出文章标题所在行,提取文章总标题
# print(title)
dl=re.findall(r'<dt>《武神风暴》正文卷</dt>.*?</dl>',html,re.S)[0]
# 提取出包含所有章节名字和网址的一大段
# print(dl)
chapter_info_list=re.findall(r'href ="/7_7685/(.*?)">(.*?)</a></dd>',dl)
# 提出每个章节网址的后半部分(不同的那部分)和章节名字
# print(chapter_info_list)
for chapter_info in chapter_info_list:
	# print(chapter_info)
    chapter_url,chapter_title=chapter_info
    # 使每个章节网址后半部分存入chapter_url,章节名称存入chapter_title
    chapter_url='https://www.biqukan.com/7_7685/%s'%chapter_url 
    # 对章节部分网址加上前面部分形成完整网址,字符串的合并,不要用加号,否则会降低程序效率
    chapter_response=requests.get(chapter_url)
    chapter_response.encoding='gbk'
    chapter_html=chapter_response.text
    chapter_text=re.findall(r'<div id="content" class="showtxt"><script>app2\(\);</script><br />(.*?)<br /><script>app2\(\);</script><br /><br />',chapter_html,re.S)[0]
    # 对每个章节文章的提取,和前面一样,\(\)对括号的转义
     # print(chapter_text)
  • re.findall:re.findall(r’正则表达式’,存放文本的变量),筛选出正则表达式的内容,以列表形式返回
  • (.*?):提取出来的内容即为括号里面的内容,一个元素时,括号可加可不加,两个元素时括号必须加上,(.*?)说白了就是找出你需要文本的前面和后面,中间用(.*?)即可
  • re.S参数:没有该参数则会在每一行中进行匹配,没有则换下一行,有在全文中进行匹配

提取部分补充说明

  • title=re.findall(r’<meta property=“og:title” content="(.*?)"/>’,html)[0]:
    在这里插入图片描述

这是在查看源代码的时候,我们要提取标题的那一段,我们要提取武神风暴这四个字,就直接把它改为(.*?),其余都一样,正则确定前后半部分后,会直接确定中间的,代码中几处关于正则的提取都是这个原理,有[0],只需要得到一条信息,没有则证明需要匹配整个列表

数据清洗和保存

数据清洗代码部分

chapter_text=chapter_text.replace(' ','')
chapter_text=chapter_text.replace('<br/>','')
chapter_text = chapter_text.replace('&nbsp;', '')
# 对于字符串chapter_text中不需要的部分,用replace函数把不需要的部分替换成空格

数据保存代码部分

import os
# 导入os模块
os.mkdir(title)
# 创建以文章名字命名的文件夹
os.chdir(title)
# 设置当前目录为刚刚创建的文件夹
fb = open('%s.txt' %chapter_title, 'w', encoding='utf-8')
fb.write(chapter_text)
# 各个章节的内容写入相应的文档文件

完整代码

import requests
import re
import os
url="https://www.biqukan.com/7_7685/"
response=requests.get(url);
response.encoding='gbk'
html=response.text
title=re.findall(r'<meta property="og:title" content="(.*?)"/>',html)[0]
os.mkdir(title)
dl=re.findall(r'<dt>《武神风暴》正文卷</dt>(.*?)</dl>',html,re.S)[0]
chapter_info_list=re.findall(r'href ="/7_7685/(.*?)">(.*?)</a></dd>',dl)
os.chdir(title)
for chapter_info in chapter_info_list:
    chapter_url,chapter_title=chapter_info
    chapter_url='https://www.biqukan.com/7_7685/%s'%chapter_url
    print(chapter_url,chapter_title)
    chapter_response=requests.get(chapter_url)
    chapter_response.encoding='gbk'
    chapter_html=chapter_response.text
    chapter_text=re.findall(r'<div id="content" class="showtxt"><script>app2\(\);</script><br />(.*?)<br /><script>app2\(\);</script><br /><br />',chapter_html,re.S)[0]
    chapter_text=chapter_text.replace(' ','')
    chapter_text=chapter_text.replace('<br/>','')
    chapter_text = chapter_text.replace('&nbsp;', '')
    fb = open('%s.txt' %chapter_title, 'w', encoding='utf-8')
    fb.write(chapter_text)
    exit() #在一次之后就结束循环,想获取全部内容,去掉这句

运行部分结果截图

小结

爬虫主要是需要爬取的网页源代码中进行分析,找出对应规律,用相应工具筛选出信息,并加以保存,该程序就是对武神风暴所有文章的爬取,在主页面中找到标题,和各个章节标题与章节域名,然后循环访问各个章节,对章节信息进行存储,初学爬虫时必然会遇到许多网站不能爬取,不要灰心,要不断尝试,并最终坚持下去

拓展

简单写下对照片与视频的爬取,可以对比下与对文本爬取的区别(照片视频一样,只列举照片),注释比较简洁

import re
import requests
url='http://www.netbian.com'
# 某壁纸网站
response=requests.get(url)
response.encoding='gbk'
html=response.text
all_photo=re.findall(r'<img src="(.*?)" alt="(.*?)" /></a></li>',html,re.S)
# 获取相片链接与名字
#print(all_photo)
i=0
for photo in all_photo:
    if i>=1:
        #print(photo)
        #photo_html=all_photo[0]
        #photo_name=all_photo[1]
        photo_html,photo_name=photo
        photo_response=requests.get(photo_html)
        #photo_response.encoding='gbk'
        photo_name='%s.jpg'%photo_name
        fb=open(photo_name,'wb')
        #相片与视频必须以wb方式写入
        fb.write(photo_response.content)
        # 必须content,content返回二进制数据,text返回unicode型文本数据
        #print(photo_response.content)
    i+=1
    if i==5:
        exit()
    # 两个if循环作用就是控制爬取壁纸张数,此时等于5,就是爬取四张
原创文章 6 获赞 7 访问量 548

猜你喜欢

转载自blog.csdn.net/jiuzhongxian_/article/details/105746341
今日推荐