大家好。今天我在这里与大家分享一下简单的网页抓取。
一、准备工作:下载并安装好python3.x,并且配置好环境变量。
二、 检查安装的软件是否可用:在cmd窗口下分别输入python -V 命令 与 pip -V命令(注意大小写)若出现版本信息即表示安装成功。然后用管理员身份打开cmd窗口,输入指令:pip install requests , 下载模块成功后即可开始打代码。
三、常识介绍:
1、URL:统一资源定位符,是互联网上标准资源的地址,互联网上的每个文件都有一个唯一的URL。你可以理解为文件在网络上的存储地址,可以通过URL去访问网络上的资源。
2、requests库:通常使用requests中的get函数进行网页访问。其中requests中有7个可使用的方法,分别是request、get、head、post、put、patch、delete。但是,事实上,由于网络安全的限制,我们很难有机会去使用后面4个方法,而request又是基本方法,也就是说,对于爬虫来说,我们一般都是使用get方法,而对于一些特别大的url链接,我们使用head方法来获得头部信息即资源概要。
3、爬取网页的通用代码框架:用requests.get方法可以获取网页的信息。但是,这不是一定会成功的,因为网络连接有风险,异常处理很重要。所以我们用到一个爬取网页的通用代码框架来保证网络连接的异常能得到处理
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
return r.text
except:
return "产生异常"
response的raise_for_status:若获得的相应为非200响应,我们可以通过 r.raise_for_status() 来抛出异常
四、robots协议:大部分网站会有这个协议,而爬虫理应遵守这个协议。查看方式为在网站后面添加代码/robots.txt即可,协议中可以有多条内容,但每一条都包含两项信息,以百度为例
Disallow: /link? Disallow: /home/news/data/ User-agent: * Disallow: /
User-agent(用户代理):表示爬虫的名称,Disallow(不允许):表示爬取的排除规则
第一条规则表示:名字符合正则表达式(link?)命名规则的爬虫不能爬取目录/home/news/data/下的文件
第二条规则表示:名字符合正则表达式(*)命名规则的爬虫(即所有爬虫)都不能爬取根目录下的信息
五、代码实现
import re,requests
for n in range(1,80):
url = "http://www.ygdy8.net/html/gndy/china/list_4_"+str(n)+".html" #观察网页换页规则,发现修改其中一项数字即可换页
html = requests.get(url) #用get函数对url进行访问请求
# html.raise_for_status() 调用变量html作为response对象的raise_for_status方法,若响应值为200则表示请求访问成功
html.encoding = html.apparent_encoding #encoding是直接获取网页头部声明的编码方式,apparent_encoding为网页实际编码格式
# print(html.text)
# print(html.status_code) if shuchu 200 qingqiuwuwu
html_list = re.findall('<a href="(.*?)" class="ulink">',html.text) #用正则表达式,匹配并提取符合规则的信息
# print(html_list)
print("%d\n"%(n))
for a in html_list:
# html_list[a] ="http://www.ygdy8.net" + html_list[a]#[:25] + str(eval(html_list[a][25:30])+21) + html_list[a][30:] #
a = "http://www.ygdy8.net" + a +"?userid=0" #d
print(a)
b = requests.get(a)
b.raise_for_status()
b.encoding = b.apparent_encoding
# print(b.text)
ftp = re.findall('><a href="(.*?)">ftp',b.text)
# print(ftp)
# print('\n')
if ftp: #用if过滤掉提取失败的网页,替代上文提到的try except 风险处理机制,然后将获取的数据储存起来即可
with open(r'E:\py\dytt.txt','a',encoding ='utf-8') as cw:
cw.write(ftp[0]+'\n'+"%d"%(n))
注:代码正文中并没有加入try except异常处理机制,只在最后用if语句将可能出错的个别连接排除。大家下去练习的时候记得加异常处理机制,这很重要。