爬虫

435次阅读
没有评论
爬虫

爬虫数据采集和解析


数据采集
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的使用:
  • 遍历文档树

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

  • 搜索树节点

    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()

    神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

    相关文章:

    版权声明:Python教程2022-10-27发表,共计3056字。
    新手QQ群:570568346,欢迎进群讨论 Python51学习