python-requests 简单实现数据抓取

时间:2021-12-27 08:37:51
安装包:
  requests,lxml
request包用于进行数据抓取,
lxml用来进行数据解析
对于对网页内容的处理,由于html本身并非如数据库一样为结构化的查询所见即所得,所以需要对网页的内容进行分析然后进行内容提取,lxml就是用来完成此项工作
在requests中最用的方法为get()方法,通常情况下可以将url做为参数传入进去,对于一些功能比较完善的网站如果存在反爬取数据的功能是则需要设置headers参数内容,内容为一字典类型
可以在浏览器中查看User-Agent字段的内容,设置后requests将在抓取数据时同时提交所设置的头信息以进行浏览器的访问模拟
同时在抓取数据时要注意网站所使用的字符编码,当编码不一至时需要对字符编码进行相应的转换
具体见以下代码注释
#!/usr/bin/python
# encoding: utf-8
import requests
from lxml import etree url='http://www.chinanews.com/scroll-news/mil/2017/0110/news.shtml' def getNewUrlList():
global url
header ={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36'}    构造浏览器头信息
response=requests.get(url,headers=header)   获取数据
html=response.content.decode("gbk")    解码
selector=etree.HTML(html)
contents = selector.xpath('//div[@id="content_right"]/div[@class="content_list"]/ul/li[div]')    使用xpath语法解析获取数据//表示从根开始查找@后跟相应的html属性
for eachlink in contents:
url = eachlink.xpath('div/a/@href')[0] if str(eachlink.xpath('div/a/@href')[0]).__contains__("http") else "http://www.chinanews.com"+eachlink.xpath('div/a/@href')[0]
title = eachlink.xpath('div/a/text()')[0]
ptime = eachlink.xpath('div[@class="dd_time"]/text()')[0]
yield (title,url,ptime) def getNewContent(urlList):
for title,url,ptime in urlList:
response=requests.get(url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36'})
html=response.content.decode("gbk")
selector=etree.HTML(html)
title=selector.xpath("//div[@id='cont_1_1_2']/h1/text()")[0]
source=selector.xpath("//div[@id='cont_1_1_2']/div[@class='left-time']/div[@class='left-t']/text()")[0]
content=selector.xpath("//div[@id='cont_1_1_2']/div[@class='left_zw']/p/text()") i=0
resultContent=''
for item in range(0,content.__len__()):
resultContent+=content[i]
i+=1
yield (title,source,resultContent) if __name__=="__main__":
urlList= getNewUrlList()
result= getNewContent(urlList)
for title,source,content in result:
print u"标题:%s"%title
print u"来源:%s"%source
print u"正文:%s"%content