一、爬取无需进行账户登录的网页信息–以某新闻网站为例
整体思路:利用urllib.request.urlopen()函数,打开某个url,返回httpResponse响应报文,该报文支持read()等文件读取方法进行读取,然后对这个响应报文利用正则表达式进行匹配搜索到自己想要爬取的信息,最后将信息存放到本地。
本案例是基于PyCharm开发的,也可以使用idea。
在项目内新建一个python文件Test.py
Test.py
# 导入urllib下的request模块
import urllib.request
# 导入正则匹配包
import re
# -*- encoding:utf-8 -*-
"""
@文档说明:测试爬虫(以爬取https://www.ittime.com.cn/news/zixun.shtml上的网页数据为例)
"""
# 步骤
# 1.确定要爬取数据的网址
# 2.获取该网址的源码
# 3.使用正则表达式去匹配网址的源码(匹配所需要的数据类型)
# 4.将爬取的数据保存至本地或者数据库
# 确定要爬取数据的网址
url="https://www.ittime.com.cn/news/zixun.shtml"
# 该网址的源码(以该网页的原编码方式进行编码,特殊字符编译不能编码就设置ignore)
webSourceCode=urllib.request.urlopen(url).read().decode("utf-8","ignore")
# 匹配数据的正则表达式
# 所有的图片
imgRe=re.compile(r'src="(.*?\.jpg)"')
# 所有的标题
titleRe=re.compile(r'(.*?)
')
# 所有的简介
contentRe=re.compile(r'(.*?)
')
# 所有的作者
authorRe=re.compile(r'(.*?)(.*?)')
# 匹配网页对应的标题数据
titles=titleRe.findall(webSourceCode)
images=imgRe.findall(webSourceCode)
content=contentRe.findall(webSourceCode)
authors=authorRe.findall(webSourceCode)
print("标题==============================================================")
for title in titles:
print(title)
print("图片==============================================================")
for image in images:
print("https://www.ittime.com.cn"+image)
print("内容简介==============================================================")
for c in content:
print(c)
print("作者==============================================================")
for author in authors:
print(author[0])
print("时间==============================================================")
for time in authors:
print(author[1])
运行Test.py,控制台输出信息。
如果分页的信息也全部需要,则写一个集合来保存这些需要读取数据的网址,将Test.py封装成方法。
在循环里依次调用
Test.py
# 导入urllib下的request模块
import urllib.request
# 导入正则匹配包
import re
# -*- encoding:utf-8 -*-
"""
@文档说明:测试爬虫(以爬取https://www.ittime.com.cn/news/zixun.shtml上的图片为例)
"""
# 步骤
# 1.确定要爬取数据的网址
# 2.获取该网址的源码
# 3.使用正则表达式去匹配网址的源码(匹配所需要的数据类型)
# 4.将爬取的数据保存至本地或者数据库
def getResouces(url):
# 该网址的源码(以该网页的原编码方式进行编码,特殊字符编译不能编码就设置ignore)
webSourceCode=urllib.request.urlopen(url).read().decode("utf-8","ignore")
# 匹配数据的正则表达式
# 所有的图片
imgRe=re.compile(r'src="(.*?\.jpg)"')
# 所有的标题
titleRe=re.compile(r'(.*?)
')
# 所有的简介
contentRe=re.compile(r'(.*?)
')
# 所有的作者
authorRe=re.compile(r'(.*?)(.*?)')
# 匹配网页对应的标题数据
titles=titleRe.findall(webSourceCode)
images=imgRe.findall(webSourceCode)
content=contentRe.findall(webSourceCode)
authors=authorRe.findall(webSourceCode)
print("标题==============================================================")
for title in titles:
print(title)
print("图片==============================================================")
for image in images:
print("https://www.ittime.com.cn"+image)
print("内容简介==============================================================")
for c in content:
print(c)
print("作者==============================================================")
for author in authors:
print(author[0])
print("时间==============================================================")
for time in authors:
print(author[1])
# 读取前十页的数据
for i in range(2,10):
getResouces("https://www.ittime.com.cn/news/zixun_"+str(i)+".shtml")
注意!!!
①无论是java后台还是python后台需要大量的数据,都可以使用这种方式,它读取速度非常快,可以保存到本地,或者数据库。读取的时候要保持有网络哦~
②使用python爬取网页的数据并不困难,重要的是对你所需的数据的源代码的分析,要善于寻找规律,并且写出正确的正则表达式
参考资料:https://blog.csdn.net/zeal9s/article/details/84031129
二、爬取需进行账户登录的网页信息
**整体思路:**利用request.Request类构建Request对象,重点是要给该对象添加请求头,模拟伪装浏览器请求。然后利用urllib.request.urlopen()函数发出此请求对象,得到httpResponse响应报文。剩余步骤和无需进行账户登录的网页爬虫一样。
参考资料:
requests 包添加请求头:https://www.jianshu.com/p/89ab535989a9
python 构造http请求对象-Request对象
利用urlopen( )方法可以实现最基本请求的发起,如果请求中需要加入Headers等信息,就可以利用request模块下的Request类构造http请求对象。其构造方法如下:
class urllib.request.Request(url, data=None, headers={ },
origin_req_host=None,unverifiable=False, method=None)
第一个参数url用于请求URL,这是必传参数,其他都是可选参数。
第二个参数data如果要传,必须传bytes(字节流)类型的。如果它是字典,可以先用urllib.parse模块里的urlencode( )编码。
第三个参数headers是一个字典,它就是请求头,我们可以在构造请求时通过headers参数直接构造,也可以通过调用请求示例的add_header( )方法添加。添加请求头最常用的用法就是通过修改User-Agent来伪装浏览器。比如要伪装火狐浏览器,我们可以把它设置为:
Mozilla/5.0(X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11
第四个参数origin_req_host指的是请求方的host名称或者IP地址。
第五个参数unverifiable表示这个请求是无法验证的,默认是False,意思就是说用户没有足够的权限来选择接收这个请求的结果。例如,我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,这时unverifiable的值就是True。
第六个参数method是一个字符串,用来指示请求使用的方法,比如GET、POST和PUT等。
from urllib import request
req=request.Request('http://www.douban.com/')#构造Request 对象,只传入url参数
req.add_header('User-Agent','Mozilla/6.0(iPhone;CPU iPhone OS 8_0 like Mac OS X) AppleWebkit/536.26 (KHTML,like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
with request.urlopen(req) as f:
print('Status:',f.status,f.reason)
for k,v in f.getheaders():
print('%s:%s'%(k,v))
print('Data:',f.read().decode('utf-8'))
参考资料:
Request对象详细构造方法:https://baijiahao.baidu.com/s?id=1624323173955549442&wfr=spider&for=pc