day20-python-spider

day20-python-spider

spider

简介

网络爬虫又称网络蜘蛛、网络机器人,他是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取出有价值的信息。

爬虫分类

  • 通用网络爬虫
  • 聚焦网络爬虫
  • 增量式网络爬虫

urllib库

爬虫库,获取网页的信息

常用方法

  • urlopen()
urllib.request.urlopen(url,timeout)
url:要爬取的网页地址
timeout:等待超时时间,超过此时间抛出异常
  • Request()
urllib.request.Request(url,headers)
Request():对请求对象的封装
url:请求的url
headers:请求头的封装
  • http的响应对象
response.read()	:读取响应的内容
response.read().decode():以指定的编码进行解码后读取响应的内容
response.url():获取url地址
response.getcode():获取请求时http的响应码

User-Agent

用户代理

User-Agent 即用户代理,简称“UA”,它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。
  • 作用
反扒策略

网站通过识别请求头中 User-Agent 信息来判断是否是爬虫访问网站。
如果是,网站首先对该 IP 进行预警,对其进行重点监控,当发现该 IP 超过规定时间内的访问次数, 将在一段时间内禁止其再次访问网站。

自定义UA代理池

模块随机获取UA

from fake_useragen import UserAgent
  • 使用
# 导入模块
from fake_useragen import UserAgent
ua=UserAgent()
# 随机获取一个ie
headers=ua.ie
# 随机获取一个火狐
headers=ua.firefox

爬虫实例--以类的方式

# 爬虫

import random
import time
import urllib
from urllib import parse
from urllib import request

from ua_info import ua_list


class MySpider(object):
    url = ""

    # 初始化url的信息
    def __init__(self):
        self.url = 'https://tieba.baidu.com/f?{}'

    # 获取一个指定url的信息
    def getUrlInfo(self, url):
        headers = {
            "User-Agent": random.choice(ua_list)
        }
        # 封装一个请求对象
        req = urllib.request.Request(url=url, headers=headers)
        # 获取网页的响应对象response
        resp = urllib.request.urlopen(req)
        # 获取页面的信息
        html = resp.read().decode("utf-8")
        return html

    # 对页面进行解析,获得想要的内容
    def parseHtml(self, html):
        pass

    # 保存文件
    def savefile(self, filename, content):
        with open(file=filename, mode="w", encoding="utf-8") as f:
            f.write(content)

    # 函数的入口
    def startRun(self):
        word = input("要搜索的关键字:")
        pn = int(input("输入要跳转的页数:"))
        # 封装参数
        params = {
            "kw": word,
            "pn": str(pn * 50)
        }
        params = parse.urlencode(params)
        # 进行字符串的拼凑
        url = self.url.format(params)
        # 定义保存文件的路径
        filename = "{}-{}页.html".format(word, pn)
        print(url)
        # 获取网页内容
        html = self.getUrlInfo(url)
        print(html)
        # 保存信息到文件
        self.savefile(filename, html)
        # 提示
        print(f"第{pn}页抓取成功")
        # 让程序休眠1秒
        time.sleep(1)


# 程序的主方法
if __name__ == "__main__":
    # 创建一个对象
    mySpider = MySpider()

    # 执行程序
    mySpider.startRun()

re模块的使用

常用方法

  • re.compile()
生成一个正则表达式对象
regex=re.compile(pattern,flags=0)
pattern:正则匹配的规则
flags:代表功能标志位,扩展正则表达式的匹配
  • re.findall()
正则表达式匹配目标字符串内容
re.findall(pattern,string,flags=0)
pattern:正则匹配的规则
string:目标字符串
flags:代表功能标志位,扩展正则表达式的匹配
  • regex.findall()
该函数根据正则表达式对象匹配目标字符串内容
regex.findall(string,pos,endpos)
string 目标字符串。
pos 截取目标字符串的开始匹配位置。
endpos 截取目标字符串的结束匹配位置。
  • re.split()
函数使用正则表达式匹配内容,切割目标字符串。返回值为切割后的列表
re.split(pattern,string,flags=0)
pattern:正则表达式。
string:目标字符串。
flags:功能标志位,扩展正则表达式的匹配。
  • re.sub()
该函数使用一个字符串替换正则表达式匹配到的内容。返回值是替换后的字符串。
re.sub(pattern,replace,string,max,flags=0)
pattern:正则表达式。
replace:替换的字符串。
string:目标字符串。
max:最多替换几处,默认替换全部,
flags:功能标志位,扩展正则表达式的匹配。
  • re.search()
匹配目标字符串第一个符合的内容,返回值为匹配的对象
re.search(pattern,string,flags=0)
pattern:正则表达式
string:目标字符串

flags功能标志位

缩写元字符 说明
A 元字符只能匹配 ASCII码。
I 匹配忽略字母大小写。
S 使得.元字符可以匹配换行符。
M 使 ^ $ 可以匹配每一行的开头和结尾位置。
  • 使用
re.findall(pattern,string,re.S)

csv模块的使用

csv介绍

CSV 文件又称为逗号分隔值文件,是一种通用的、相对简单的文件格式,用以存储表格数据,包括数字或者字符。CSV 是电子表格和数据库中最常见的输入、输出文件格式。
  • 文件格式

CSV文件写入

  • csv.writer()
write(csvfile,dialect="excel",**fmtparams)
csvfile:必须是支持迭代(Iterator)的对象,可以是文件或者list对象
dialect:编码风格,默认为excel的风格,也就是使用逗号,分隔
fmtparam:格式化参数,用来覆盖之前dialect对象指定的编码风格
  • 范例
import re
import csv
from urllib import parse

with open("eggs.csv", "w", newline="") as f:
    # delimiter 指定分隔符,默认是逗号,这里只当空格
    # quotechar 表示引用符,当一句话中有与分隔符相同的符号时,为了区分,使用引用符括起来
    # writerow  单行写入,列表格式传入数据,写入多行writerows(),传入列表,元素为元组
    spamwriter = csv.writer(f, delimiter=" ", quotechar="*")
    spamwriter.writerow(['www.biancheng.com'] * 5 + ['how are you'])
    spamwriter.writerow(['hello world', 'web site', 'www.biancheng.com'])
  • csv.DictWriter()
以字典的形式写入数据
  • 范例
with open(file="demo02.csv",mode="w",newline="",encoding="utf-8") as f:
    # 声明表头
    fieldName=["姓名","年龄","性别"]
    spamwriter=csv.DictWriter(f,fieldnames=fieldName)
    # 写入字段当作表头
    spamwriter.writeheader()
    spamwriter.writerow({"姓名":"丫丫","年龄":"18","性别":"女"}

CSV的读取

  • csv.reader()
csv.reader(csvfile, dialect='excel', **fmtparams)
csvfile:必须是支持迭代(Iterator)的对象,可以是文件或者list对象
dialect:编码风格,默认为excel的风格,也就是使用逗号,分隔
fmtparam:格式化参数,用来覆盖之前dialect对象指定的编码风格
  • 范例
with open("demo.csv","r",newline="",encoding="utf-8") as f:
    spamwriter=csv.reader(f,delimiter="-",quotechar="|")
    for row in spamwriter:
        print(row)
  • csv.DictReader()
with open("demo02.csv",newline="",encoding="utf-8") as f:
    reader=csv.DictReader(f)
    print(type(reader))
    for row in reader:
        print(row["姓名"],row["年龄"],row["性别"])

其他

robots协议

input()

input([prompt]):接受一个标准输入数据,返回一个字符串
prompt:提示,提示信息

parse.quote(str)

对字符串进行编码,
按照标准,URL只允许一部分ASCII字符,其他字符(如汉字)是不符合标准的,此时就要进行编码

str.format()

pyhton2.6新增的一种格式化字符串的函数
>>>"{} {}".format("hello", "world")    # 不设置指定位置,按默认顺序
'hello world'
 
>>> "{0} {1}".format("hello", "world")  # 设置指定位置
'hello world'
 
>>> "{1} {0} {1}".format("hello", "world")  # 设置指定位置
'world hello world'

random.choice()

choice() 方法返回一个列表,元组或字符串的随机项。
注意:choice()不能直接访问,需要导入random模块

urlencode(dict)

将存入的字典参数编码为URL查询字符串,即转换成以key1=value1&key2=value2的形式

time.sleep()

time.sleep(random.randint(1,2)) 随机休眠1-2秒
作用:爬虫程序访问网站会非常快,这与正常人类的点击行为非常不符。因此,通过随机休眠可以使爬虫程序模仿成人类的样子点击网站,从而让网站不易察觉是爬虫访问网站,但这样做的代价就是影响程序的执行效率。

正则表达式元字符()的作用:分组

(pattern) 匹配pattern并获取这一匹配的内容,如果有多个(),就会返回多个结果的集合
获取符合分组内的规则的字符串

正则表达式贪婪模式和非贪婪模式

通过在量词后面加?
不加问号就是贪婪模式,加问号就是非贪婪模式
例如:.*?  和 {m}?
区别:
	贪婪模式:尽可能多的去匹配
	非贪婪模式:尽可能少的去匹配

*参数名和**参数名

作为函数定义时:
1、*参数收集所有未匹配的位置参数组成一个tuple对象,局部变量args指向此tuple对象
2、**参数收集所有未匹配的关键字参数组成一个dict对象,局部变量kwargs指向此dict对象

作为函数调用时:
1、*参数用于解包tuple对象的每个元素,作为一个一个的位置参数传入到函数中
2、**参数用于解包dict对象的每个元素,作为一个一个的关键字参数传入到函数中
posted @ 2022-04-07 23:28  黎白昼  阅读(62)  评论(0)    收藏  举报