爬虫1-python简单实践网页爬取+解析

爬虫

1.获取HTML网页信息

import requests
url = 'http://product.dangdang.com/29148702.html'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000 "
    }                                    #模拟真实浏览器,防止触发反爬
aa=requests.get(url,headers=headers)     #对目标网页发送访问请求
message=aa.content.decode('gbk')         #对爬取页面解码
print(message)                           #对该返回信息做进一步解析可以提取出想要的信息

2.解析HTML网页:常见方法有正则、beautifulsoup4、xpath、json、HTMLParser等。其中:

结构化标签解析:beautifulsoup4、xpath、HTMLParser三者掌握其一即可;

ajax加载的字典类型数据解析:json;

正则表达式可用于任何场景数据解析。

  2.1  xpath

语法参考xpath菜鸟教程

基于1中返回信息,先转成HTML,借助f12在网页浏览器上定位,再用xpath处理提取所需元素

import requests
from lxml import etree
url = 'http://product.dangdang.com/29148702.html'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000 "
    }
aa=requests.get(url,headers=headers)
message=aa.content.decode('gbk')
content=etree.HTML(message)                                 #message是str格式,需要先转成HTML格式

print(content.xpath('//*[@id="author"]/a[1]/text()').pop())  #作者       #运用xpath语法提取所需元素,如果不用.pop(),返回列表
print(content.xpath('//*[@class="name_info"]/h1[1]/text()').pop().strip())  #书名
print(content.xpath('//*[@dd_name="大图"]/img/@src').pop())   #图片
print(content.xpath('//*[@dd_name="出版社"]/a/text()').pop()) #出版社
print(content.xpath('//*[@class="messbox_info"]/span[3]/text()').pop())  #出版时间
print(content.xpath('//*[@class="price_info clearfix"]/div[2]/div/div/p[2]/text()').pop()) #价格

2.2 json

语法参考json菜鸟教程

ajax异步加载的数据以json形式返回,可借助json在线解析网站查看数据标签层级结构,再对所需标签内容解析

2.3正则表达式

语法参考python正则表达式菜鸟教程

对爬取到的非规则字符串采用正则表达式解析可以获取所需规整字段,通常可以补充2.1,2.2

常用re模块,re.match(); re.search(); re.findall()

import re
import requests

url = 'http://product.dangdang.com/29148702.html'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000 "
    }
aa=requests.get(url,headers=headers)
message=aa.content.decode('gbk')

print(re.findall('.*_name="出版社"',message))

2.4beautifulSoup

参考BeautifulSoup4文档
import requests
from bs4 import BeautifulSoup
import html5lib
import json
import re

url = 'http://product.dangdang.com/29148702.html'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000 "
    }
aa=requests.get(url,headers=headers)
message=aa.content.decode('gbk')
bs=BeautifulSoup(message, features="html5lib")    # content需要用到的解析内容;html5lib解析器

print(bs.find('a', dd_name="评论数").text)         #find找出第一条,默认是class名,也可指定为“dd_name”
ss=bs.find_all('a', dd_name=re.compile('.*'))     #find_all找出全部,可以用正则
print(ss)
item_list = bs.find_all("a", dd_name=re.compile('.*'))
print(len(item_list))


# find_all:查找所有标签
# 第一个参数为标签名,第二个参数为标签的class名,命名参数为标签属性参数
# find:查找第一个标签
# text:标签包含的内容
# 使用多个指定名字的参数可以同时过滤tag的多个属性
# find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag:find_all(attrs={"data-foo": "value"})
# 按 CSS搜索soup.find_all("a", class_="sister")


原文地址:https://www.cnblogs.com/foolangirl/p/14129761.html