Python利用requests和xpath爬取网页内容过程
文章目录
- 遇到的问题及解决方法
- 1.xpath()函数的使用-之后会练习使用find_all()函数
- 1.1 XPath 常用规则
- 1.2 获取文本
- 1.3 要提取的信息有大量空格
- 1.4 多属性匹配
- 1.5 提取的网址不是完全意义上的网址
- 1.4 遇到tbody的情况如何处理:
- 1.5 提取的内容有好多tr,td:
- 2. etree.HTML()函数解析
- 3. 保存到Exce:
- 4. 突然提取不出信息了,返回的是空列表的解决办法
- 4.1 注意如果网页操作太频繁的话会被冻结,这个时候可以用time库里面的sleep操作:
- 源代码
遇到的问题及解决方法
1.xpath()函数的使用-之后会练习使用find_all()函数
需要安装lxml库,xpath()方法放回的结果是一个列表
1.1 XPath 常用规则
表达式 | 描述 |
---|---|
nodename | 1 |
// | 从当前节点选取子孙节点 |
/ | 从当前节点选取子节点 |
. | 选取当前结点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
例子:
//title[@lang='eng']
这是一个 XPath 规则,代表的是选择所有名称为 title,同时属性 class 的值为 eng 的节点,后面会通过 Python 的 lxml 库,利用 XPath 进行 HTML 的解析。
1.2 获取文本
# 第一种
# 获取文本所在节点后直接获取文本
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]/a/text()')
print(result)# 第二种
# 会获取到补全代码时换行产生的特殊字符,推荐使用第一种方法,可以保证获取的结果是整洁的。
from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]//text()')
print(result)
1.3 要提取的信息有大量空格
使用normalize-space()函数:
# 提取出来会有大量空格
level = html.xpath('//table[@class="info-tb"]/tr[4]/td[4]/text()')
# 使用normalize-space()
level = html.xpath('normalize-space(//table[@class="info-tb"]/tr[4]/td[4]/text())')
1.4 多属性匹配
# 直接在xpath中使用and
from lxml import etree
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
1.5 提取的网址不是完全意义上的网址
只是部分的网址,例如这个网站提取的就是缺少https://dl.58.com
的网址,所以要给加上这一块,当提取完后,可以直接这样:
return ['https://dl.58.com' + item for item in list_urls]
1.4 遇到tbody的情况如何处理:
这是网页的规范性问题,可以直接跳过,我们定位路径的时候可以直接忽略这个点
1.5 提取的内容有好多tr,td:
这个时候我们可以直接定位到某一个点:
# 第三个tr,第四个td
price = html.xpath('normalize-space(//table[@class="info-tb"]/tr[3]/td[4]/text())')
xpath
2. etree.HTML()函数解析
etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。
url = "https://dl.58.com/xiaoqu/150/"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/87.0.4280.88 Safari/537.36"
}
rep = requests.get(url, headers=headers)
rep.encoding = 'utf-8'
# print(rep.text) 输出的是网页的全部源代码
html = etree.HTML(rep.text)
# 通过xpath筛选出所需要的代码信息
list_url = html.xpath('//ul[@class="xq-list-wrap"]/li/div[@class="pic"]/a/@href')
3. 保存到Exce:
需要调用xlwt库,同时也需要利用pip安装:pip install xlwt
import xlwt
# 创建一个workbook
workbook = xlwt.Workbook(encoding='utf-8')
# 创建表名
data_sheet = workbook.add_sheet('sheet1')
# 设置表头
row0 = ['1', '2', '3', '4', '5', '6']
# 将第一行写进去
for k in range(0, len(row0)):data_sheet.write(0, k, row0[k])
# 利用cnt控制行数
cnt = 1
# 写入全部数据
for item in all_url:list_informations = []list_informations += get_information(item)for j in range(0, len(list_informations)):data_sheet.write(cnt, j, list_informations[j])cnt += 1
# 保存文件
workbook.save('filename.xlsx')
4. 突然提取不出信息了,返回的是空列表的解决办法
一般这种情况,往往是因为网站觉得你操作太频繁了,需要手动验证一下,这个时候手动打开一个网页,根据网页提示进行操作一个,即可继续进行信息提取。
4.1 注意如果网页操作太频繁的话会被冻结,这个时候可以用time库里面的sleep操作:
# 生成随机数的函数randint
from random import randint
# 设置睡眠时间,即多久运行一次
from time import sleep
# 放到函数里即可,程序执行到这里会进行停顿
sleep(randint(2, 5))
源代码
爬取某同城某地区全部小区信息
from random import randint
import requests
# 直接保存到本地
from lxml import etree
from time import sleep
# 创建excel表格的
import xlwtdef get_name__url():list_urls = []for i in range(1, 20):if i == 1:url = "https://dl.58.com/xiaoqu/150/"else:url = "https://dl.58.com/xiaoqu/150/pn_%d/" % iheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/87.0.4280.88 Safari/537.36"}rep = requests.get(url, headers=headers)rep.encoding = 'utf-8'# print(rep.text)html = etree.HTML(rep.text)list_url = html.xpath('//ul[@class="xq-list-wrap"]/li/div[@class="pic"]/a/@href')list_urls += list_urlreturn ['https://dl.58.com' + item for item in list_urls]def get_information(url):# print(url)list_information = []sleep(randint(2, 5))# print(url)headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/87.0.4280.88 Safari/537.36"}rep = requests.get(url, headers=headers)rep.encoding = 'utf-8'html = etree.HTML(rep.text)name = html.xpath('//div[@class="body-wrapper"]/div[@class="title-bar"]/span/text()')# print(name)value = html.xpath('//div[@class="body-wrapper"]/div[@class="basic-container"]//div[''@class="price-container"]/span/text()')[:2]# all_information = html.xpath('//div[@class="body-wrapper"]/div[@class="basic-container"]/div['# '@class="info - tb - container"]/table[@class="info-tb"]/tr[5]/td[2]/text()')build_year = html.xpath('normalize-space(//table[@class="info-tb"]/tr[5]/td[2]/text())')level = html.xpath('normalize-space(//table[@class="info-tb"]/tr[4]/td[4]/text())')# print(level)nums = html.xpath('normalize-space(//table[@class="info-tb"]/tr[2]/td[4]/text())')# print(nums)price = html.xpath('normalize-space(//table[@class="info-tb"]/tr[3]/td[4]/text())')# print(price)list_information += namelist_information.append(value)list_information.append(build_year)list_information.append(level)list_information.append(nums)list_information.append(price)print(list_information)return list_informationif __name__ == '__main__':all_url = get_name__url()workbook = xlwt.Workbook(encoding='utf-8')# 创建表名data_sheet = workbook.add_sheet('小区')row0 = ['小区名称', '均价', '建造年代', '容积率', '户数', '物业费']for k in range(0, len(row0)):data_sheet.write(0, k, row0[k])cnt = 1for item in all_url:# 看看执行到多少条了print(cnt)list_informations = []list_informations += get_information(item)for j in range(0, len(list_informations)):data_sheet.write(cnt, j, list_informations[j])cnt += 1workbook.save('沙口区小区信息.xlsx')print("程序执行完成")
Python利用requests和xpath爬取网页内容过程相关推荐
- 爬虫实战(二)—利用requests、selenium爬取王者官网、王者营地APP数据及pymongo详解
概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider ,包括了项目的所有代码. 本文 ...
- Python网络爬虫使用BeautifulSoup爬取网页内容并存入数据库案例
使用BeautifulSoup爬取网页内容并存入数据库案例 学习了Python网络爬虫,完成里一个比较完整的爬虫案例与大家分享 爬取地址:http://www.tipdm.com/cpzx/index ...
- Python爬虫如何实用xpath爬取豆瓣音乐
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...
- python利用高德接口,爬取武汉地区的POI--一个不太成熟的BUG,程序总是跑着跑着就假死了。
说明 1.遇到的问题 可是爬取过程中总是不顺利,程序总是爬着爬着就不动了,有时爬几千条假死,有时爬几万条假死.数据库中没有新数据增加,程序也不报错,也不中止.CPU,内存占用也不高,硬盘中也还有空间, ...
- python 爬取豆瓣某一主题书单_Python爬虫 || 使用requests和xpath爬取豆瓣Top250书单内容全解。...
昨天,我们了解了如何爬取豆瓣某一个电影固定的位置信息,包含电影名称.导演.演员及评分等,今天我们来了解一下如何爬取豆瓣Top250书单,并如何将爬取到的内容存放到本地. 废话不多说了,shou my ...
- Python爬虫之利用requests,BeautifulSoup爬取小说标题、章节
爬取雪鹰领主标题和章节内容为列: 查看网页的源代码,如下图所示: 获取html内容部分 import requests headers = {'User-Agent': 'Mozilla/5.0 ( ...
- python3爬虫记(一)------------------利用 requests 和 lxml 爬取小说
PS 本人第一次写博客,写的不好和不对的地方请见谅,欢迎各位指出和交流. (使用的是 anaconda3) (这里用到的requests 和 lxml 的详细内容参见 http://docs.pyth ...
- Python利用selenium简单的爬取网易云歌曲排行榜
最近学习了一下selenuim和XPath,技术还很菜,简单的爬取了一下网易云歌曲的排行榜信息,最后保存到mongodb里面 要爬取的部分如下图所示: 爬取每个歌曲的排名,名称,时长,歌手. 创建mo ...
- 详解Python 采用 requests + Beautiful Soup 爬取房天下新楼盘推荐
最近一直在关注Python写爬虫相关的知识,尝试了采用requests + Beautiful Soup来爬取房天下(原搜房网)的推荐新楼盘. 不用不知道,一用发现有惊喜也有惊吓,本文就一同记录下惊喜 ...
最新文章
- 风险清退之后,这类平台反而更靠谱
- 记忆网络RNN、LSTM与GRU
- OpenJudge/Poj 2027 No Brainer
- numpy中数组维度的理解
- 分库分表下极致的优化
- spring源码分析第五天------springAOP核心原理及源码分析
- android升级异常,升级AndroidX遇到的问题
- JS里设控件不可用取值
- SQLserver查询练习
- FileUpload1.PostedFile.FileName 获取的文件名
- caj打开文件错误验证服务器,CAJ 打开pdf文件错误(无法读取交叉引用表)的解决方法...
- Metro 风格页面设计
- 韶音耳机连不上电脑_骨传导耳机怎么连接电脑
- 结合Delphi和Python的优势:使用Delphi VCL组件快速构建超现代的Python本机Windows GUI桌面酷炫用户界面应用
- python 爬取腾讯视频弹幕
- 《降伏其心》节选:从辟谷揭开修行的真相
- 《我们的梦》——我公司形象歌曲
- 妙控2代鼠标用于Windows系统注册表修改方法
- 领卓教育科技有限公司毕业实习报告
- 【AVD】杀鸡用牛刀,FFmpeg API 加载存储图片,比 ImageMagic 和 stb_image 快多了
热门文章
- linux centos livecd,定制自己的LiveCD,依托(centos)
- 『重磅』2022年度高等教育中国学科评级结果发布
- 嫌苹果鼠标(magic mouse)的灵敏度(跟踪速度)设置最大了都不够快,妙控板(magic trackpad)的灵敏度(跟踪速度)设置最大了都不够快(苹果鼠标/妙控板命令行设置灵敏度)
- JS农历公历互转 阳历阴历互转
- 后悔没早点看这篇直播系统定制开发入门篇
- 以太坊2.0究竟何时落地?V神这样说……
- 微软CEO鲍尔默的一天(组图)
- vue中plain=true是什么意思
- 计算机中push英语是什么意思,push是什么意思_push的翻译_音标_读音_用法_例句_爱词霸在线词典...
- visual studio 编辑器窗口分屏