一. 正则解析数据
解析百度新闻中每个新闻的title,url,检查每个新闻的源码可知道,其title和url都位于<a></a>标签中,因为里面参数的具体形式不一样,同一个正则并不能匹配并提取所有新闻的标题和url,如下图
target为确定值,在正则中可以写死,class也为确定值,在正则中也可写死,但class并不存在于所有的a标签中(自己的想法是写2个正则进行匹配(带class与否),最后将得到的数据汇总),mon里的数值也不一样,所以需要用正则匹配出来,到时候进行二次处理(若不需要的话),以下为代码(带class,同理不带class)
import re import requests url = 'http://news.baidu.com/' headers = { "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' } # response.text 不太准确 转码 是靠推测 data = requests.get(url, headers=headers).content.decode() # 正则解析 数据[u4e00-u9fa5]
pattern = re.compile('<a href="(.*?)" target="_blank" class="a3" mon="(.*?)"(.*)</a>')
result = pattern.findall(data)
print(result)
结果如下(截取部分图):
二. xpath解析数据
1. 安装支持并能解析html和XML的解析库 ------lxml:
pip install lxml
2. 转换数据的解析类型
xpath_data = etree.HTML(data)
3. xpath语法
1. “/” 表示节点
result = xpath_data.xpath('/html/head/title//text()') # 按照节点顺序一级一级获取内容
2. “//” 表示跨节点
result = xpath_data.xpath('//a/text()') # 跨节点获取内容
3.精确的标签: //a[@属性="属性值"]
result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]') # 得到a标签对象
result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/text()') # 获取内容
4. 获取某个标签的url: @href
result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/@href')
代码
import re import requests # 安装支持 解析html和XML的解析库 lxml # pip install lxml from lxml import etree url = 'http://news.baidu.com/' headers = { "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' } # response.text 不太准确 转码 是靠推测 data = requests.get(url, headers=headers).content.decode() # 1.转解析类型 xpath_data = etree.HTML(data) # 2调用 xpath的方法 result = xpath_data.xpath('/html/head/title//text()') result = xpath_data.xpath('//a/text()') result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]') result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/@href') result = xpath_data.xpath('//li/a/text()') print(result)
with open('02news.html', 'w') as f:
f.write(data)
三 练习1 爬取btc论坛title以及相应的url
这个论坛爬取不到信息(html源码),应该是做了反爬处理了,可能的原因:
Ajax动态加载
ajax动态加载的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行javaScript程序。这些程序会加载出更多的内容,并把这些内容传输到网页中。这就是为什么有些网页直接爬取它的URL时却没有数据的原因。
解决方案:
使用审查元素分析“请求”对应的连接(方法:审查元素--->Network---->清空,点击加载更多,出现对应的Get连接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。如果请求之前有页面,依据上一步的网址进行分析推导第一页。以此类推,抓取Ajax地址的数据。对返回的json使用request中的json进行解析,使用eval()转成字典处理