zoukankan      html  css  js  c++  java
  • 爬虫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")
    
    
    
  • 相关阅读:
    【技术贴】【技术贴】每次双击都会跳出来打开方式的解决办法。。。选择你想用来打开此文件的程序。。
    【技术贴】xp更改登录头像,打开“用户账户”时显示:Automation服务器不能创建对象。的解决办
    【技术贴】关于惠普在郑州建立全球云计算服务中心的解析。。来自大河报
    【技术贴】如何删除卡巴斯基的日志?占C盘了好多空间....
    2007 Office 产品版本号
    SharePoint Workflow 基础
    重装SPS 2003的一点经验
    列出有空应该看一下的要点
    WinDBG命令概览(下) 扩展命令
    Content Deployment入门(下)
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14129761.html
Copyright © 2011-2022 走看看