快速入门Python爬虫|requests请求库|pyquery定位库

Posted 向阳-Y.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速入门Python爬虫|requests请求库|pyquery定位库相关的知识,希望对你有一定的参考价值。

1.分析爬虫

阶段类型问题需要做到
1请求网页数据在哪里?发现网址url规律
2请求如何获取网页数据先尝试使用requests成功访问一个url,拿到一个页面数据
3解析html中定义需要的数据使用pyquery对这一个页面的网页数据进行解析
3解析从json中定位需要的数据使用json或resp.json()进行json网页数据解析
4存储如何存储数据使用csv库将数据存储到csv文件中
5大功告成重复2-4for循环对所有的url进行访问解析存储

以大众点评为例:
http://www.dianping.com/shanghai/hotel

发现网址规律

1.根据规律构造
2.批量生成网址对常规的html网页数据,一般多点击翻页即可发现url规律.

template='http://www.dianping.com/shanghai/hotel/p{P}'
for page in range(1,51):
	url=template.format(P=page)
	print(url)

2.库

requests网络请求库

一、安装

pip install requests   //Win命令行
pip3 install requests   //Mac命令行

二、访问方法
requests两种访问方法,两者都返回Response对象:

常用参数参数解读使用频率
requests.get(url,headers,cookies,params,proxies)发起get访问,返回Response对象95%
requests.post(url,headers,cookies,data,proxies)发起post访问,返回Response对象5%
import requests
url='http://www.dianping.com/shanghai/hotel/p1'
resp=requests.get(url)
resp

三、返回Response
Response后面带有的状态码:

· 2开头表示访问正常
· 4开头,比如403表示爬虫被网站封锁
· 5开头表示服务器出问题

若出现403(如上图),解决办法如下:伪装

爬虫反爬[转链接]

Python爬虫反爬方法

import requests
url='http://www.dianping.com/shanghai/hotel/p1'
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36'}   //在开发者工具中寻找headers参数,并整理成字典格式
resp=requests.get(url,headers=headers)
resp

Response常用方法:

Response对象的方法作用使用评率
Response.json()获得json网页数据35%
Response.text获得html网页数据60%
Response.content获取二进制数据(如文件、图片、音视频)5%
Response.encoding根据charset设置网页数据编码很少用到

例如:

pyquery网页解析定位库

安装

pip install pyquery

假设我们访问得到了一个网页的html字符串数据:

>html = open('example.html', encoding='utf-8').read()
>html

html字符串转化为PyQuery

> from pyquery import PyQuery
> doc=PyQuery(html)
> doc

如下图,html字符串变成了下图内容,下图表示doc目前是可被循环的


从下图可看出,html字符串被转换成了pyquery类型

选择器表达式

在人类关系中,可以通过父母,子女,亲戚,外貌,邻居进行定位一个人
同理,在html世界也有很多不同的表达式来定位标签

Selector_Expression例子解释
class.Intro选出class="Intro"的标签,返回PyQuery
id#intro选出id="intro"的标签,返回PyQuery
tagli选出所有li标签的标签,返回PyQuery
多层tagul li选出所有li标签(且这些li辈分都比ul低),返回PyQuery
tag & attrli[class]选出带有class属性所有li标签,返回PyQuery
tag & attr & attr_valueli[class=cando]选出所有li标签,其中li都带有class="cando"属性值

class

>doc('.Intro')  #利用class进行定位

id

>doc('#Intro')  #利用ID进行定位

tag

##PyQuery(Selector_Expression)
>doc('ul')      #利用标签进行定位(不常用,精确度不高)

多层tag

>doc('html body .Intro') #多层tag
>doc('html body #intro') #多层tag
>doc('html ul li')       #多层tag
>doc('.intro ul li')     #多层tag
>doc('#intro ul li')     #多层tag

tag & attr

>doc('li[class]')定位含有class的li标签
>doc('div[title]')定位含有title的div标签
>doc('li[name]')定位含有name的li标签

tag & attr & attr_value

>doc('li[class=cando]')
>doc('div[title]=')
>doc('li[name=web]')

PyQuery常用方法

PyQuery对象方法功能
PyQuery(Selector_Expression)查找符合Selector_Expression条件的标签,返回PyQuery
PyQuery.items(Selector_Expression)查找符合Selector_Expression条件的标签,返回PyQuery列表
PyQuery.eq(index)获得第index+1个标签
PyQuery.text()获得标签内的文本
PyQuery.attr(attribute)获得标签的属性值

PyQuery(Selector_Expression)

>doc('li')

PyQuery.items(Selector_Expression)

>doc.items('li')  #将li的数据打包为可遍历的值


这样的返回值表示是可遍历的:

PyQuery.eq(index)

eq表示第几行,从0开始

print(doc("li").eq(0))

PyQuery.text()

拿标签内的文本,只要是PyQuery类型的数据都可以拿

print(doc("li").eq(0).text())
print(doc.text[:100]) #表示只拿前100个字符

PyQuery.attr(attribute)

拿到属性值

doc("li").eq(0).attr("name")
doc("li").eq(0).attr("class")

不定位使用text会输出所有text内容(不精确)、不定位使用attr只会给出第一个属性值(其余被忽略)。总结:建议全部定位到具体位置再使用attr和text。

以上是关于快速入门Python爬虫|requests请求库|pyquery定位库的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫之Requests库入门

Python网络爬虫与信息提取—requests库入门

网络爬虫入门:你的第一个爬虫项目(requests库)

python网络爬虫与信息提取——1.requests库入门

Python网络爬虫入门篇

Python 爬虫入门(requests)