我,菜鸡,有什么错误,还望大家批评指出!!

前言:

根据自己写的上一篇文章,我继续更第二部分的内容,详情请点击如下链接

【python】爬虫篇:python连接postgresql(一):https://blog.csdn.net/lsr40/article/details/83311860

本文主要介绍了python通过bs4(BeautifulSoup和xpath两种方法来获取爬到的html页面上想要的部分!废话不多说,开始!

正文:

在上一篇文章中我们可以拿到一个叫做rows的对象,这个对象就是数据库里一条一条的数据,因此需要遍历每一条数据,然后打开url拿到html的页面信息再做解析。

1、遍历rows

遍历就不用说了吧,for row in rows....

2、通过urllib打开页面(当然也有其他的框架,比如requests)

这个说一点:

# 当我如下的方式运行代码的时候,有时候程序会假死
# 就是突然卡主,然后什么都不做
file = urllib.request.urlopen(url)
# 因此要这么写,给定一个超时时间,如果请求不到就直接跳过了
file = urllib.request.urlopen(url,timeout=5)

3、对于获得的页面html做解析

解析是这样的,我测试了下我的电脑上运行,差不多1s,可以跑完两条查到数据库。然后bs4和xpath的速度没有什么特别大的区别,但是xpath确实会快一点。

当我使用bs4的时候遇到RecursionError: maximum recursion depth exceeded in comparison这样的报错,原因可以看https://blog.csdn.net/cliviabao/article/details/79927186(cliviabao的原创文章),报错解释如下:

file = urllib.request.urlopen(row[2],timeout=5)try:data = file.read()  # 读取全部soup = BeautifulSoup(data.decode('utf-8'), 'html.parser')# 就是在find_all报了错,因此我想这样遍历应该是递归遍历,层数太深result = soup.find_all('p', text=True)# 解决方法有两种:第一种(治标不治本,叫做把递归层数增加)
import sys
sys.setrecursionlimit(100000) #例如这里设置为十万  # 第二种:避免这种错误的查找,比如你想找一个div,他的class名字叫正文,而且通篇只有这个一个,那么
# 所以可以去找找find_all可传入的参数
result = soup.find_all(name='div', attrs={"class": "zhengwen"}, limit=1)

另一种就是xpath,有几点说明一下:

1、有时候可能会被封ip,虽然爬虫却还在爬着数据,不过这些数据肯定都是有问题的,所以要加一个标识,发现爬到的页面发现ip已经被封了,可以发送警报,并且插到数据库的数据就加上某个被封的标识,用来下次重跑这部分数据。

2、有个小插曲,被封了ip之后我怎么都无法通过xpath的方法来判断被封了(因为被封的消息并不是直接写在html的标签里面的,而是在js中write的),所以我只能用python中str的find方法来判断是否被封(可以添加偏移量,不从头开始遍历字符串)

find方法的使用:http://www.runoob.com/python/att-string-find.html

3、关于xpath的使用方法:

大家可以百度些文章自己学着写写,或者直接打开网页,F12进入到开发者模式,找到你要的那部分网页信息在哪个标签中,接下来复制出来他的xpath,如下两图所示,复制出来会类似这种东西//*[@id="csdn-toolbar"]就可以直接使用了!

代码如下:

try: file = urllib.request.urlopen(url,timeout=5)data = file.read()  # 读取全部#这里可以添加上判断是否被封号的标志,如果被封号就发提醒,或者在插入数据库的时候表示下,这数据采集的时候已经被封ip了,所以得重新采集这部分被封ip的数据isBan=str(data).find('xxx', 3000)if(isBan!=-1):string='ip被封'else:selector = etree.HTML(data)data = selector.xpath('//*[@id="js_content"]/p/span/text()')for i in data:if (i != None):string = string + i  # .replace('\'', '''''')

4、关于速度

当然爬虫的速度是非常需要关注的一个点!首先肯定是越快越好,但是不同网站会做不同的黑名单机制,也就是说你访问的太快有可能会直接被封ip,因此就需要一台可以自动换ip的服务器,当然这就不在讨论这段代码的范畴之内了。

在这里,我只考虑的如何加快爬虫的速度!!

我就想到两种方法:

1、多线程(一段代码里开启多个线程,同时访问不同页面)

2、多进程(运行多个python脚本,来达到同时访问不同页面)

我选用第一种方式(完整代码):

# 这里的productList方法只实现了获取页面具体的内容,还缺少将获取到的数据插入数据库的实现,未完待续!
def productList(rows):string=''try: file = urllib.request.urlopen(url,timeout=5)data = file.read()  # 读取全部isBan=str(data).find('xxx', 3000)if(isBan!=-1):string='ip被封'else:selector = etree.HTML(data)data = selector.xpath('//*[@id="js_content"]/p/span/text()')for i in data:if (i != None):string = string + i  # .replace('\'', '''''')except Exception as e:# e.partial 这个属性据说是报错的时候已经接受的html内容,没有实际测试过data = '代码异常'print('Error', e)if __name__ == '__main__':conn_1 = psycopg2.connect(database="数据库", user="用户", password="密码",host="ip",port="端口")cur1 = conn_1.cursor()# 查出urlsql1 = "select xxx from xxx"cur1.execute(sql1)rows = cur1.fetchall()print('拉取到数据')# 这里就是开启10个线程来跑productList方法,并且我考虑到了需要批量插入数据,因此一次性往线程中传入10条url,然后将10条url一起插入数据库(其实可以更多条一起插入)with ThreadPoolExecutor(10) as executor:for i in range(0, len(rows)//10, 1):executor.submit(productList, rows[i*10:(i+1)*10])# 结束关闭连接conn_1.close()

以上就是我关于python对应html页面解析要说的全部内容,大家如果还有什么问题可以给我留言,或许我能帮上什么忙~

好了,本人菜鸡一个,如果有说的不对的地方,或者不够合理的处理方式,还望各位大神指点迷津,谢谢各位!!

未完待续!

【python】爬虫篇:python对于html页面的解析(二)相关推荐

  1. Python 爬虫篇-爬取web页面所有可用的链接实战演示,展示网页里所有可跳转的链接地址

    原理也很简单,html 链接都是在 a 元素里的,我们就是匹配出所有的 a 元素,当然 a 可以是空的链接,空的链接是 None,也可能是无效的链接. 我们通过 urllib 库的 request 来 ...

  2. 自学python推荐书籍 知乎-在知乎上学 Python - 爬虫篇

    知乎是个好地方.虽然近年来,为了吸引更多的用户,知乎的定位与早期略有点偏离.但从内容质量和专业性来说,知乎仍然是国内数一数二的知识型社区.不少同学都是通过知乎发现了我们编程教室,我自己也经常会通过知乎 ...

  3. 1000行代码入门python-在知乎上学 Python - 爬虫篇

    知乎是个好地方.虽然近年来,为了吸引更多的用户,知乎的定位与早期略有点偏离.但从内容质量和专业性来说,知乎仍然是国内数一数二的知识型社区.不少同学都是通过知乎发现了我们编程教室,我自己也经常会通过知乎 ...

  4. 电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分

    电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分,是电影天堂APP项目开发课程的第一篇章,讲解使用requests和bs4库,爬取和解析电影天堂网站数据,并讲数据保存到SQLite数 ...

  5. python爬虫代码-python网络爬虫源代码(可直接抓取图片)

    在开始制作爬虫前,我们应该做好前期准备工作,找到要爬的网站,然后查看它的源代码我们这次爬豆瓣美女网站,网址为:用到的工具:pycharm,这是它的图标 ...博文来自:zhang740000的博客 P ...

  6. 从Python爬虫到Spark预处理数据的真实需求[二]

    絮叨两句: 博主是一名软件工程系的在校生,利用博客记录自己所学的知识,也希望能帮助到正在学习的同学们 人的一生中会遇到各种各样的困难和折磨,逃避是解决不了问题的,唯有以乐观的精神去迎接生活的挑战 少年 ...

  7. Python爬虫入门之淘宝JS逆向解析请求参数Sign加密(一)

    关于JS逆向,相信这是很多小伙伴学习爬虫的一个门槛之一,如果你是初学者入门,开发一款爬虫,要以思路为主,代码是其次的 这里所说的思路指两个方面,一,分析观察目标站点思路,二,代码开发思路,二者缺一不可 ...

  8. python爬虫原理-python学习之python爬虫原理

    原标题:python学习之python爬虫原理 今天我们要向大家详细解说python爬虫原理,什么是python爬虫,python爬虫工作的基本流程是什么等内容,希望对这正在进行python爬虫学习的 ...

  9. python爬虫工程师-Python爬虫工程师

    课程概况 3个月精通Python爬虫工程师核心技能. 从入门到进阶,知识点全覆盖,配套实战练习. 包含课程 入门篇 Python编程环境配置及基础语法 掌握Python基础语法及虫技能,利用Pytho ...

  10. python爬虫代码-Python爬虫入门(01) -- 10行代码实现一个爬虫

    跟我学习Python爬虫系列开始啦.带你简单快速高效学习Python爬虫. 一.快速体验一个简单爬虫 以抓取简书首页文章标题和链接为例 简书首页 就是以上红色框内文章的标签,和这个标题对应的url链接 ...

最新文章

  1. Oracle的闪回技术--闪回错误的DML操作
  2. 面试结尾——你有什么问题?
  3. Android开发:Handler的简单使用(一)
  4. QT QTableWidget 用法总结
  5. [Web 前端] react-router4-0中文文档
  6. 在多核CPU上安装SQL SERVER 2005注意
  7. leetcode 1178. Number of Valid Words for Each Puzzle | 1178. 猜字谜(bitmask位运算)
  8. SpringCloud系列之Nacos+Dubbo+Seata应用篇
  9. 计算机应用能力考试初级,河北省职称计算机应用能力考试初级
  10. AOJ-776 马的走法 动态规划
  11. 2021年全国各行业统计年鉴整理
  12. 动态电路电容电感充放电分析
  13. 32位kali安装minidwep_原水_新浪博客
  14. 计算机游戏实践报告,关于在校学生玩电脑游戏的调查报告
  15. conda 解决An HTTP error occurred when trying to retrieve this URL.
  16. IAR3.11.1 搭建 STM8S003 模板工程
  17. 蓝桥杯单片机(十一)PCF8591(A/D转换)
  18. java计算机毕业设计校园二手书交易系统源码+系统+数据库+lw文档+mybatis+运行部署
  19. markdown转pdf
  20. 出生日期转化为岁月天

热门文章

  1. 如何取消IE浏览器的域账号登录
  2. 风能风力发电系统案例
  3. 【计算机网络复习之路】数据链路层(谢希仁第8版)0基础也能看懂 !!!
  4. 赖特 因果分析_那个时候,赖特会把你放在查尔斯·达尔文的鞋子上
  5. ANDROID左侧菜单官方实现
  6. hutool 树结构工具实战
  7. linux清理内存占用
  8. 美团,滴滴,塔斯克小厂普通二本实习生面试内容,无广告安心食用
  9. 内网穿透工具zerotier的安装及使用
  10. [转帖]CR3,PDE,PTE,TLB 内存管理的简单说明