1.目前所学爬虫的四种解析方法
Jsonpath
匹配规则:
从根节点$开始然后利用“.”来依次向下访问,可以用“..”来直接定位到需要的元素
流程:
导入json和jsonpath两个包
利用loads()方法将json文件加载成python中的字典(
B = json.loads(a) )
利用jsonpath的规则来提取
C = jsonpath.jsonpath( json文件的字典类型名字,规则)
代码:
正则表达式
匹配规则:
流程:
导入re库
正常从网上获取html,并转码
而后用re.compile()函数将正则表达式的字符串格式编译成对象并赋值出去
将该对象在html中去匹配,(对象名.findall(文档名))
代码:
Lxml模块的xpath
匹配规则:
nodename |
选取此节点的所有子节点。 |
|
/ |
从根节点选取。 |
|
// |
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
|
. |
选取当前节点。 |
|
.. |
选取当前节点的父节点。 |
|
@ |
选取属性。 |
|
通配符 |
描述 |
|
* |
匹配任何元素节点。 |
|
@* |
匹配任何属性节点。 |
|
node() |
匹配任何类型的节点。 |
流程:
导入lxml库的etree包和requests库。
正常爬取想要的网站(requests.get())。
然后将爬取到的html转化为utf8的形式(html=res.content.decode(‘utf8’))。
然后先将转换后的html文档变成xml文档利用xml=etree.HTML()方法(参数为转换的html????????
最后就是用xml.xpath()方法去提取数据了(此处参数为规则)
代码:
Beautifulsoup模块
匹配规则:xxx=bs.find_all(‘模块名’,属性_=’名字’)
惯用语句流程:
从bs4导入BeautifulSoup
用resquests访问网站获得响应
将网络响应解码成字符串形式
然后去解析HTML文档 运用:bs=BeautifulSoup(html,’html.parser’)html为要解析的文本,html.parser为解析器
然后利用匹配规则去匹配数据
代码:
爬虫多协程的运用
流程:
导入各个模块与包(声明猴子补丁)
.写个url列表把网址都存放进去
创建queue()队列对象(队列对象的作用就是将url全部添加到里面后,爬虫要爬取时才从队列队像里面拿一个网址出来爬取,故而可以达到调节一个爬虫崩掉后剩余的网址无法完成)
创建crawler函数(作用为:从url列表里面取出网址后访问网站获取html文档存入文件中,该类的执行体)
创建任务列表(普通列表)以此来存放任务,先用for循环来创建需要有多少个爬虫来执行,后用gevent.spawn()函数(参数为def函数)来创建执行某函数的任务,而后将结果赋给task后将task加入任务列表中→6.用gevent.joinall()去执行任务(参数为一个列表,就是所要执行的任务列表)
代码:
selenium模块(实现抓取动态网页,模拟真人操作电脑)
流程:
先导入包,将selenium库的webdriver包导入程序
如果想要不显示出来的话,就要添加无界面参数(
options=webdriver.ChromeOptions()
options.add_argument(‘--headless’)
options.add_argument(‘--no-sandbox’))
而后进行设置游览器引擎,如果要添加无界面的话就要把参数赋进去
browser=webdriver.Chrome()
用引擎调用get方法去获取服务器响应(将响应传给了引擎,此时引擎是有html数据的)
利用提取规则提取想要的东西
最后要记得关闭游览器 close()方法
(可以模拟手机去登录网站,手机端获取的源码和pc端不一样options.add_argument( '--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3') )
可以与beautifulsoup一起用更佳:
Selenium有个方法是Browser.page_source其作用为获取网页源码,获取到了html就可以用beautifulsoup去解析html然后再用匹配规则去匹配数据
代码如下:
browser.get(网址)
(中间需要给时间让selenium去加载页面)
Html=browser.page_source
Html=Html.content.decode(‘utf8’)
Bs=BeautifulSoup(html,’html.parser’)
(匹配规则)
selenium模块操作元素的常用方法:
clear() 清楚元素内容 ②.send_keys()模拟按键输入,自动填写表单 ③.click() 点击元素
Selenium模块的提取单个元素的方法(提取多个元素在selenium后加s):
代码: