赞
踩
PS:如果不懂的可以看我的上一篇文章快速入门Python爬虫
阶段 | 类型 | 问题 | 需要做到 |
---|---|---|---|
1 | 请求 | 网页数据在哪里? | 发现网址url规律 |
2 | 请求 | 如何获取网页数据 | 先尝试使用requests成功访问一个url,拿到一个页面数据 |
3 | 解析 | 从html中定义需要的数据 | 使用pyquery对这一个页面的网页数据进行解析 |
3 | 解析 | 从json中定位需要的数据 | 使用json或resp.json()进行json网页数据解析 |
4 | 存储 | 如何存储数据 | 使用csv库将数据存储到csv文件中 |
5 | 大功告成 | 重复2-4 | for循环对所有的url进行访问解析存储 |
以大众点评为例:
http://www.dianping.com/shanghai/hotel
大众点评网址规律,每一页对应p1,p2…
针对规律写出如下代码
>template='http://www.dianping.com/shanghai/hotel/p{page}'
>for p in range(1,51):
url=template.format(page=p)
print(url)
先尝试使用requests成功访问一个url,拿到一个页面数据:以p1为例
>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"}
>resp=requests.get(url,headers=headers)
>resp.text[:1000] #表示获取前1000个字符内容
通过headers伪装成功拿到:
使用pyquery对这一个页面的网页数据进行解析,首先使用select工具定位到hotel-block块
通过tag多级
进行精确定位
以下输出关于含有hotel-block属性的块
from pyquery import PyQuery
doc=PyQuery(resp.text)
for hotel in doc.items('.hotel-block'):
print(hotel)
以下为输出关于含有a标签和hotel-name属性的行。,text()可以取出标签中的值
for hotel in doc.items('.hotel-block'):
print(hotel('.hotel-name a'))
依次类推,改进代码:最终
from pyquery import PyQuery
doc=PyQuery(resp.text)
for hotel in doc.items('.hotel-block'):
hotel_name=hotel('.hotel-name-link').text()
addr1=hotel('.place a').text()
addr2=hotel('.walk-dist').text()[1:]
print(hotel_name,addr1,addr2)
输出如下图:
使用csv库将数据存储到csv文件中,–>不会的请点我<–
>>> import csv
>>> path='F:/papapa/data/dianpin.csv'
>>> csvf=open(path,'a+',encoding='utf-8',newline='')
>>> fieldnames=['hotel_name','addr1','addr2']
>>> writer=csv.DictWriter(csvf,fieldnames=fieldnames)
>>> writer.writeheader()
>>> for hotel in doc.items('.hotel-block'):
hotel_name=hotel('.hotel-name-link').text()
addr1=hotel('.place a').text()
addr2=hotel('.walk-dist').text()[1:]
data={'hotel_name':hotel_name,
'addr1':addr1,
'addr2':addr2}
writer.writerow(data)
>>> csvf.close()
总结2-4,并爬取每一页的数据
import requests from pyquery import PyQuery import csv #新建csv path='F:/papapa/data/dianpin.csv' csvf=open(path,'a+',encoding='utf-8',newline='') fieldnames=['hotel_name','addr1','addr2'] writer=csv.DictWriter(csvf,fieldnames=fieldnames) writer.writeheader() template='http://www.dianping.com/shanghai/hotel/p{page}' 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"} for p in range(1,51): print(p) url=template.format(page=p) resp=requests.get(url,headers=headers) doc=PyQuery(resp.text) #存储数据 for hotel in doc.items('.hotel-block'): hotel_name=hotel('.hotel-name-link').text() addr1=hotel('.place a').text() addr2=hotel('.walk-dist').text()[1:] data={'hotel_name':hotel_name, 'addr1':addr1, 'addr2':addr2} writer.writerow(data) csvf.close()
本篇代码可阅读性不强,特此发布一篇用函数封装后的文章,欢迎查看~
python爬虫实战一|大众点评网(2)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。