系列文章目录
爬虫学习笔记(一):requests基础用法之爬取各类主流网站1
前言
抱歉,由于工作上的原因,很久没有更新了。作为初学者,难免会遇到很多坑,本系列主要想给初学者一些借鉴,相信大家都碰上过,复制网站上的代码却无法运行的情况,本系列文字主要帮助你解决这些问题,防止掉到坑里。提示:以下是本篇文章正文内容,下面案例可供参考
一、复习REQUEST+XPATH爬取
上节课,我们使用REQUEST+XPATH爬取了豆瓣和知乎日报的标题信息,你肯定会问为啥选这两个网站,因为这2个网站都是采用python编写的,爬取内容也都保存在elements中,爬取比较容易。
下面,我们继续爬取另一个python语言编写的网站果壳网www.guokr.com(和这类网站杠上了),继续使用这个套路。
代码如下(示例):
import requests
from lxml import html
url='https://www.guokr.com/science/category/science' #需要爬数据的网址
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
response=requests.get(url,headers=headers)
print(response.status_code)
page=requests.Session().get(url,headers=headers)
tree=html.fromstring(page.text) #
result=tree.xpath('//div[@class="layout__Skeleton-zgzfsa-3 styled__InfoTitileWrap-sc-1b13hh2-7 eCquRY"]//text()') #获取需要的数据
count = 0
for i in result:
print(i, end='\n')
count += 1
if (count % len(result) == 0):
print(end='\n')
套路总结如下:
1.requests.get(url)抓取一个链接的页面;
2.抓取的页面字符形式喂给 html.fromstring();
3.xPath定位并提取感兴趣的内容;
4.数据写入数据库或txt;
当然lxml也有别的写法,比如from lxml import etree
代码如下(示例):
import requests
from lxml import etree
url='https://www.guokr.com/science/category/science' #需要爬数据的网址
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
print(response.status_code)
page=requests.Session().get(url,headers=headers)
tree=etree.HTML(page.text)
result=tree.xpath('//div[@class="layout__Skeleton-zgzfsa-3 styled__InfoTitileWrap-sc-1b13hh2-7 eCquRY"]//text()') #获取需要的数据
count = 0
for i in result:
print(i, end='\n')
count += 1
if (count % len(result) == 0):
print(end='\n')
总结如下:
1.requests.get(url)抓取一个链接的页面;
2.抓取的页面内容以text的形式由etree.HTML进行解析;
3.xPath定位并提取感兴趣的内容;
使用细节上有一些细微差别,但得出的结果其实是一样的。套路
二、Chrome页面查找关键词进行定位
1.使用Chrome浏览器查找爬取页面的关键词。
普通网页的信息都能在Elements中查找到,但也包含例外。lxml库具有的局限性,只能分析HTML的页面。还有一种方法是我们可以使用Chrome浏览器的检查页面下的Search功能查找对应的信息,在NETWORK-Response进行定位。
以BILIBILI的番剧网页为例,网址如下:https://www.bilibili.com/v/popular/rank/bangumi
代码如下(示例):
import requests
from lxml import etree
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
base_url = "https://www.bilibili.com/v/popular/rank/bangumi"
response = requests.get(url=base_url, headers=headers)
html = response.content.decode("utf-8")
print(html)
etree_obj = etree.HTML(html)
# 链接
ret = etree_obj.xpath('//div[@class="info"]/a[@class="title"]/text()')
print(ret,end=",")
ret1 = etree_obj.xpath('//div[@class="info"]/a[@class="title"]/@href')
print(ret1,end=",")
data_zip = zip(ret[0:],ret1[0:])
# 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,
# 然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
#我们可以使用 list() 转换来输出列表。
#print(list(data_zip))