浅谈Python爬虫

参考文章:传送门

Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有价值数据)。

  • 调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。
  • URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。
  • 网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)
  • 网页解析器:将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常的困难)、html.parser(Python自带的)、beautifulsoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析 xml 和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。
  • 应用程序:就是从网页中提取的有用数据组成的一个应用。

Python爬虫爬取某一页面中所有的链接

参考文章:传送门

import requests
from bs4 import BeautifulSoup

resp=requests.get('https://www.zero0.top') #请求百度首页
print(resp) #打印请求结果的状态码
print(resp.content) #打印请求到的网页源码

bsobj=BeautifulSoup(resp.content,'lxml') #将网页源码构造成BeautifulSoup对象,方便操作
a_list=bsobj.find_all('a') #获取网页中的所有a标签对象
text='' # 创建一个空字符串
for a in a_list:
    href=a.get('href') #获取a标签对象的href属性,即这个对象指向的链接地址
    text+=href+'\n' #加入到字符串中,并换行
with open('url1.txt','w') as f: #在当前路径下,以写的方式打开一个名为'url.txt',如果不存在则创建
    f.write(text) #将text里的数据写入到文本中

Requests库通过http协议发送请求,并处理返回的数据。

食用教程

BeautifulSoup库:HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。

食用教程

Python爬虫按页爬取某一网站中的图片

参考文章:传送门

import os
import re

import requests
from bs4 import BeautifulSoup


def getHtml(url):  # 固定格式,获取html内容
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/78.0.3904.108 Safari/537.36 '
    }  # 模拟用户操作
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()  # 判断返回值是否为200,如果不是200,他就会产生一个HttpError的异常
        r.encoding = r.apparent_encoding  # 指定r.encoding的编码格式;通过r.apparent_encoding属性来指定,直接将其值赋给r.encoding
        return r.text
    except:
        print('网络状态错误')


def getUrlList(url):  # 获取图片链接
    url_list = []  # 存储每张图片的url,用于后续内容爬取
    demo = getHtml(url)
    soup = BeautifulSoup(demo, 'html.parser')
    sp = soup.find_all('div',
                       class_="list")  # class='list'在全文唯一,因此作为锚,获取唯一的div标签;注意,这里的网页源代码是class,但是python为了和class
    # (类)做区分,在最后面添加了_
    nls = re.findall(r'a href="(.*?)"', str(sp))  # 用正则表达式提取链接
    for i in nls:
        if 'https' in i:  # 因所有无效链接中均含有'https'字符串,因此直接剔除无效链接(对应第3条的分析)
            continue
        if 'pic' in i:
            continue
        url_list.append('http://www.netbian.com/' + i)  # 在获取的链接中添加前缀,形成完整的有效链接
    return url_list
    print(url_list)


def fillPic(url, page):  # 保存图片
    pic_url = getUrlList(url)  # 调用函数,获取当前页的所有图片详情页链接
    path = './图片'  # 保存路径
    for p in range(len(pic_url)):
        pic = getHtml(pic_url[p])
        soup = BeautifulSoup(pic, 'html.parser')
        psoup = soup.find('div', class_="pic")
        picUrl = re.findall(r'src="(.*?)"', str(psoup))[0]
        pic = requests.get(picUrl).content
        image_name = '图片' + '第{}页'.format(page) + str(p + 1) + '.jpg'
        image_path = path + '/' + image_name
        with open(image_path, 'wb') as f:
            f.write(pic)
            print(image_name, '下载完毕!!!')


def main():
    n = input('请输入要爬取的页数:')
    url = 'http://www.netbian.com/dongman/'
    if not os.path.exists('./图片'):
        os.mkdir('./图片/')
    page = 1
    fillPic(url, page)
    if int(n) >= 2:
        ls = list(range(2, 1 + int(n)))
        url = 'http://www.netbian.com/dongman/'
        for i in ls:
            page = str(i)
            url_page = 'http://www.netbian.com/dongman/'
            url_page += 'index_' + page + '.htm'
            fillPic(url_page, page)


main()

OS库:与操作系统相关的标准库。如:文件,目录,执行系统命令等。

食用教程

RE库:主要用于字符串的匹配。

食用教程


手书无愧,无惧人间是非