文章目录

  • 遇到的问题及解决方法
    • 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爬取网页内容过程相关推荐

  1. 爬虫实战(二)—利用requests、selenium爬取王者官网、王者营地APP数据及pymongo详解

    概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider ,包括了项目的所有代码. 本文 ...

  2. Python网络爬虫使用BeautifulSoup爬取网页内容并存入数据库案例

    使用BeautifulSoup爬取网页内容并存入数据库案例 学习了Python网络爬虫,完成里一个比较完整的爬虫案例与大家分享 爬取地址:http://www.tipdm.com/cpzx/index ...

  3. Python爬虫如何实用xpath爬取豆瓣音乐

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  4. python利用高德接口,爬取武汉地区的POI--一个不太成熟的BUG,程序总是跑着跑着就假死了。

    说明 1.遇到的问题 可是爬取过程中总是不顺利,程序总是爬着爬着就不动了,有时爬几千条假死,有时爬几万条假死.数据库中没有新数据增加,程序也不报错,也不中止.CPU,内存占用也不高,硬盘中也还有空间, ...

  5. python 爬取豆瓣某一主题书单_Python爬虫 || 使用requests和xpath爬取豆瓣Top250书单内容全解。...

    昨天,我们了解了如何爬取豆瓣某一个电影固定的位置信息,包含电影名称.导演.演员及评分等,今天我们来了解一下如何爬取豆瓣Top250书单,并如何将爬取到的内容存放到本地. 废话不多说了,shou my ...

  6. Python爬虫之利用requests,BeautifulSoup爬取小说标题、章节

    爬取雪鹰领主标题和章节内容为列: 查看网页的源代码,如下图所示:  获取html内容部分 import requests headers = {'User-Agent': 'Mozilla/5.0 ( ...

  7. python3爬虫记(一)------------------利用 requests 和 lxml 爬取小说

    PS 本人第一次写博客,写的不好和不对的地方请见谅,欢迎各位指出和交流. (使用的是 anaconda3) (这里用到的requests 和 lxml 的详细内容参见 http://docs.pyth ...

  8. Python利用selenium简单的爬取网易云歌曲排行榜

    最近学习了一下selenuim和XPath,技术还很菜,简单的爬取了一下网易云歌曲的排行榜信息,最后保存到mongodb里面 要爬取的部分如下图所示: 爬取每个歌曲的排名,名称,时长,歌手. 创建mo ...

  9. 详解Python 采用 requests + Beautiful Soup 爬取房天下新楼盘推荐

    最近一直在关注Python写爬虫相关的知识,尝试了采用requests + Beautiful Soup来爬取房天下(原搜房网)的推荐新楼盘. 不用不知道,一用发现有惊喜也有惊吓,本文就一同记录下惊喜 ...

最新文章

  1. 风险清退之后,这类平台反而更靠谱
  2. 记忆网络RNN、LSTM与GRU
  3. OpenJudge/Poj 2027 No Brainer
  4. numpy中数组维度的理解
  5. 分库分表下极致的优化
  6. spring源码分析第五天------springAOP核心原理及源码分析
  7. android升级异常,升级AndroidX遇到的问题
  8. JS里设控件不可用取值
  9. SQLserver查询练习
  10. FileUpload1.PostedFile.FileName 获取的文件名
  11. caj打开文件错误验证服务器,CAJ 打开pdf文件错误(无法读取交叉引用表)的解决方法...
  12. Metro 风格页面设计
  13. 韶音耳机连不上电脑_骨传导耳机怎么连接电脑
  14. 结合Delphi和Python的优势:使用Delphi VCL组件快速构建超现代的Python本机Windows GUI桌面酷炫用户界面应用
  15. python 爬取腾讯视频弹幕
  16. 《降伏其心》节选:从辟谷揭开修行的真相
  17. 《我们的梦》——我公司形象歌曲
  18. 妙控2代鼠标用于Windows系统注册表修改方法
  19. 领卓教育科技有限公司毕业实习报告
  20. 【AVD】杀鸡用牛刀,FFmpeg API 加载存储图片,比 ImageMagic 和 stb_image 快多了

热门文章

  1. linux centos livecd,定制自己的LiveCD,依托(centos)
  2. 『重磅』2022年度高等教育中国学科评级结果发布
  3. 嫌苹果鼠标(magic mouse)的灵敏度(跟踪速度)设置最大了都不够快,妙控板(magic trackpad)的灵敏度(跟踪速度)设置最大了都不够快(苹果鼠标/妙控板命令行设置灵敏度)
  4. JS农历公历互转 阳历阴历互转
  5. 后悔没早点看这篇直播系统定制开发入门篇
  6. 以太坊2.0究竟何时落地?V神这样说……
  7. 微软CEO鲍尔默的一天(组图)
  8. vue中plain=true是什么意思
  9. 计算机中push英语是什么意思,push是什么意思_push的翻译_音标_读音_用法_例句_爱词霸在线词典...
  10. visual studio 编辑器窗口分屏