爬虫 - 数据采集和解析

爬虫数据采集和解析


数据采集
1. 下载数据的方式 - urllib、requests、aiohttp
  • urllib 用法

    from urllib.request import urlopen
    html = urlopen('http://sports.sohu.com/nba_a.shtml').read()
  • requests用法

    import requests
    resp = requests.get(current_url, headers=headers, proxies=proxies)
    
    二进制页面: resp.content
    原生的页面: resp.text
  • aiohttp用法

    import aiohttp
    with aiohttp.ClientSession() as session:
        with session.get(url) as resp:
            resp.status
            resp.cookies
2. 解析数据 - re(正则表式)/lxml/beautifulsoup4(bs4)/pyquery
  • BeautifulSoup

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(page_html, 'lxml')
3. 缓存和持久化 - pymysql/redis/sqlalchemy/peewee/pymongo
  • 意思就是把数据存放到数据库中

  • 连接redis数据库:

    import redis
    redis_client = redis.Redis(host='112.74.171.100', port=6379, password='xxxxxx')
  • 连接mongodb数据库:

    import pymongo
    mongo_client = pymongo.MongoClient(host='112.74.171.100', port=27017)
    
4.生成摘要 - hashlib
  • 意思就是数据加密之后再存放到数据库中,可以查看菜鸟教程,加密,有好几中加密方式,下面介绍是使用sha1

    from hashlib import sha1
            hasher_proto = sha1()
            hasher = hasher_proto.copy()
            hasher.update(current_url.encode('utf-8'))
            doc_id = hasher.hexdigest()
5.序列化和压缩
  • 把生成的页面进行序列化和压缩之后,并且转成二进制后再存入数据库

    import pickle
    import zlib
    from bson import Binary
    
    Binary(zlib.compress(pickle.dumps(page_html)))
6.调度器 - 进程/线程/协程/ 用来执行爬虫


数据解析

HTML代码通常由三部分组成,分别是:用来承载内容的Tag(标签)、负责渲染页面的CSS(层叠样式表) 以及控制交互式行为的JavaScript。通常,我们可以在浏览器的右键菜单中通过”查看网页源代码”的方式获取网页的代码并了解页面的结构;当然,我们也可以通过浏览器提供给的开发人员工具来了解网页更多的信息

1.使用request获取页面:
1.GET请求、POST请求
2. url参数、请求头
3.复杂的post请求
4.操作Cookie
5.设置代理服务器
6.超时设置

说明: 关于requests的详细的用法可以参考它的官方文档

2. BeautifulSoup的使用:
  1. 遍历文档树

    获取标签
    获取标签属性
    获取标签的内容
    获取子(孙)节点
    获取父节点、祖先节点
    获取兄弟节点
    
  2. 搜索树节点

    find/find_all: 字符串、正则表达式、列表、True、函数或Lambda
    select_one/select:CSS选择器
    

    查找所有具有href属性为xxx的a标签

    soup.find_all('a', {'href': xxx})
    

    取出a标签使用for循环迭代

    for a_tag in soup.find_all('a', {'href': xxx}):
        判断 href 字符,存不存在a标签中
        if 'href' in a_tag.attrs:
            href = a_tag.attrs['href']
            拼接字符串
            full_url = urljoin(base_url, href)
    

    其他用法

    soup.body.select('a[href]')
    soup.body.select('img[src]')
    soup.title
    soup.body.h1
    soup.body.div.p
    soup.find_all(re.compile(r'p$'))
    soup.find_all('img', {'src': re.compile(r'\./img/\w+.png')})
    soup.find_all(lambda x: len(x.attrs) == 2)
    soup.find_all('p', {'class': 'foo'})[0]
    soup.select('p', {'src'})
    soup.select_one('form input[name=authenticity_token]').attrs['value']
    
实例 - 获取知乎上发现的问题链接
from urllib.parse import urljoin

import re
import requests

from bs4 import BeautifulSoup


def main():
    headers = {'user-agent': 'Baiduspider'}
    proxies = {
        'http': 'http://122.114.31.177:808'
    }
    base_url = 'https://www.zhihu.com/'
    seed_url = urljoin(base_url, 'explore')
    resp = requests.get(seed_url,
                        headers=headers,
                        proxies=proxies)
    soup = BeautifulSoup(resp.text, 'lxml')
    href_regex = re.compile(r'^/question')
    link_set = set()
    for a_tag in soup.find_all('a', {'href': href_regex}):
        if 'href' in a_tag.attrs:
            href = a_tag.attrs['href']
            full_url = urljoin(base_url, href)
            link_set.add(full_url)
    print('Total %d question pages found.' % len(link_set))


if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值