爬虫实操

示例

requests模块下载和安装

requests模块在使用前需要先安装,可以在系统控制台下输入如下命令完成:

pip install requests -i http://pypi.douban.com/simple–trusted-host=pypi.douban.com

参数介绍

使用requests的get函数从指定网页上下载数据:
get(url, params=None, **kwargs)
作用:发送一个get请求。
url参数:指定要从哪个网址获取网页数据。
params参数:(可选)在请求时发送的字典、元组列表或字节类型的数据。
**kwargs参数:一些可选参数。
返回:Response类对象。
如:request=requests.get(url, timeout=30, headers=headersParameters)
headersParameters中保存了请求头的信息
headersParameters = {
Connection’: ‘Keep-Alive’, # Connection决定当前的事务完成后,是否会关闭网络连接。如果该值是“KeepAlive”,网络连接就是持久
'Accept’: ‘text/html, application/xhtml+xml, /’, #浏览器接收的媒体类型,text/html代表HTML格式,application/xhtml+xml代表XHTML格式,/ 代表浏览器可以处理所有类型
Accept-Language’: ‘en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3’, #浏览器申明自己接收的语言
Accept-Encoding’: ‘gzip, deflate’, #浏览器申明自己接收的编码方式:通常指定压缩、是否支持压缩、支持什么方式压缩(gzip/default)
User-Agent’: ‘Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko’ #告诉HTTP服务器客户端浏览器使用的操作系统和浏览器的版本和名称}

网页中提取信息

在浏览器下访问网页,按键盘上的F12功能键出现浏览器的调试工具查看页面上的元素,查看要获取元素的HTML代码
在这里插入图片描述
设计的正则表达式:

r'<h3 class="c-title">([\s\S]*?)</h3>'

通过re.sub函数去除title中多余的HTML标记,如

re.sub(r'<[^>]+>','',title) #去除title中的所有HTML标记

数据显示和文件保存

通过for循环将这些新闻标题显示在屏幕上,如:
no=1
for title in titles:
	print(str(no)+':'+title)
	no+=1
按类似的方法,也可以将新闻标题写入到filepath所对应的文件中,如:
with open(filepath, 'w') as f: #使用with语句,以使得文件操作完毕后文件能够自动关闭
	no=1
	for title in titles:
		f.write(str(no)+':'+title+'\n')
		no+=1
代码
import re
import requests
from urllib.parse import quote #导入quote方法对URL中的字符进行编码
class BaiduNewsCrawler: #定义BaiduNewsCrawler类
	headersParameters = { #发送HTTP请求时的HEAD信息
	'Connection': 'Keep-Alive',
	'Accept': 'text/html, application/xhtml+xml, */*',
	'Accept-Language': 
	'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
	'Accept-Encoding': 'gzip, deflate',
	'User-Agent': 
	'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
	}

def __init__(self, keyword, timeout): #定义构造方法
	self.url='https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&rsv_dl=ns_pc&word=' + quote(keyword) + '&x_bfe_rqs=03E80&x_bfe_tjscore=0.002213&tngroupname=organic_news&pn='#要爬取的新闻网址
	self.timeout=timeout #连接超时时间设置(单位:秒)
	self.titles = []
def GetHtml(self, startIdx): #定义GetHtml方法
	request=requests.get(self.url+str(startIdx),timeout=self.timeout,headers=self.headersParameters) #根据指定网址爬取网页
	self.html=request.text #获取新闻网页内容
def GetTitles(self, recnum): #定义GetTitles方法
	titles = re.findall(r'<h3 class="c-title">([\s\S]*?)</h3>',self.html) #匹配新闻标题
	for i in range(len(titles)): #对于每一个标题
		temp=re.sub(r'<[^>]+>','',titles[i]) #去除所有HTML标记,即<...> 
		self.titles.append(temp.strip()) #将标题两边的空白符去掉
		if len(self.titles)==recnum:
			break

def PrintTitles(self): #定义PrintTitle方法
	no=1
	for title in self.titles: #显示标题
		print(str(no)+':'+title)
		no+=1
def ExportToFile(self, filepath): #定义ExportToFile方法,将标题输出到文件中
	with open(filepath, 'w', encoding='utf-8') as f:
	no=1
	for title in self.titles:
		f.write(str(no)+':'+title+'\n')
		no+=1
def GetTitlesNum(self): #定义GetTitlesNum方法,返回已获取的新闻标题数
	return len(self.titles)

if __name__ == '__main__':
	bnc = BaiduNewsCrawler('南开大学',30) #创建BaiduNewsCrawler类对象
	oldStartIdx = startIdx = 0
	recnum = 45 #要获取的新闻标题数
	while startIdx<recnum:
		bnc.GetHtml(startIdx) #获取新闻网页的内容
		bnc.GetTitles(recnum) #获取新闻标题
		startIdx = bnc.GetTitlesNum() #得到已获取的新闻标题数
		print('已获取'+str(startIdx)+'条新闻标题')
	bnc.PrintTitles() #显示新闻标题
	bnc.ExportToFile('newstitlelist.txt') #将新闻标题保存到文件中

结尾

记录自己的快乐学习日志,也祝贺观看到这的小伙伴早日学有所成,财富自由💰💰。
记得点赞👍、收藏👋呀!!!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐