商业爬虫学习笔记day6

一. 正则解析数据

解析百度新闻中每个新闻的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

 

   

猜你喜欢

转载自www.cnblogs.com/jj1106/p/11223218.html