其他分享
首页 > 其他分享> > 爬虫01

爬虫01

作者:互联网

爬虫笔记

爬虫分类

  1. 通用网络爬虫(搜索引擎使用,遵守robots协议)

    robots协议:网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,通过网络爬虫需要遵守robots协议。

    实例:www.baidu.con/robots.txt

  2. 聚焦网络爬虫:自己写爬虫程序

爬虫数据步骤

  1. 确定需要爬取的URL地址
  2. 有请求模块向URL地址发出请求,并得到网站响应。
  3. 从响应中提取数据
    1. 所需数据,保存
    2. 页面中有其它需要跟进的URL地址,继续第二部请求,如此循环

爬虫模块

requests模块

  1. 常用方法

requests.get()

【1】作用
	向目标网站发起请求,并获取对象
	
【2】参数
	url:需要抓取url地址
	headers:请求头
	timeout:超时时间,超时会抛出异常

http://httpbin.org/get这是测试网站可以返回请求数据

响应参数

import requests

result = requests.get('https://www.jd.com/')

# content响应内容为bytes,decode('utf-8')然后用utf-8解码
result = requests.get('https://www.jd.com/').content.decode('utf-8')

# text响应字符串
result = result.text

# content响应内容为bytes,爬取图片、音频、文件、视频
result = result.content

# http响应码result.status_code
code = result.status_code
print(code)

urllib.parse模块

这个库作用:url地址中有中文的可以对URL地址解码

from urllib import parse
params = parse.urlencode({'wd':'赵丽颖','pn':'10'})
print(params)

输出**************
#多个参数中间&符号会自动加上
wd=%E8%B5%B5%E4%B8%BD%E9%A2%96&pn=10

快速生成拼接URL

import requests
from urllib import parse

url = 'www.baidu.com/s?{}'
for i in range(1,101):
    page = (i-1)*10
    params = parse.urlencode({'wd': '赵丽颖', 'pn': str(page)})
    page_url = url.format(params)
    print(page_url)
    
    
*********************部分输出***********************
www.baidu.com/s?wd=%E8%B5%B5%E4%B8%BD%E9%A2%96&pn=0
www.baidu.com/s?wd=%E8%B5%B5%E4%B8%BD%E9%A2%96&pn=10
www.baidu.com/s?wd=%E8%B5%B5%E4%B8%BD%E9%A2%96&pn=20
www.baidu.com/s?wd=%E8%B5%B5%E4%B8%BD%E9%A2%96&pn=30

unquote(string)解码

#将编码后的字符串转为普通的unicode字符串
import requests
from urllib import parse

params = '%E8%B5%B5%E4%B8%BD%E9%A2%96'
result = parse.unquote(params)

*********************部分输出***********************
赵丽颖

案例:输入明星名称、开始页数、结束页数,爬取HTML到本地

【1】查看所抓取的数据在响应内容中是否存在,应为现在有好多数据时动态加载出来
	右键--查看网页源代码--搜索关键字
    
【2】查找并分析URL规律

【3】发送请求并获取响应内容
import requests
from urllib import parse
import time
import random


class BaiduTieba():
    def __init__(self):
        # https://tieba.baidu.com/f?kw=%E8%B5%B5%E4%B8%BD%E9%A2%96&pn=100
        self.url = 'http://tieba.baidu.com/f{}'
        self.header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}

    def get_html(self, url, header):
        result = requests.get(url, headers=self.header).content.decode('utf-8')
        return result

    def parse_html(self):
        # 数据解析处理
        pass

    def save_html(self, filename, html):
        with open(filename, 'w') as f:
            f.write(html)

    def run(self):
        name = input('请输入明星名称:')
        start_page = input("请输入开始页数:")
        end_page = input("请输入结束页数:")
        # 解析URL和请求
        for page in range(int(start_page), int(end_page) + 1):
            pn = (page - 1) * 50
            #解码有中文URL并拼接页数
            params = parse.urlencode({'kw': name, 'pn': str(pn)})
            url = self.url.format(params)
            html = self.get_html(url, self.header)
            filename = '{}第{}页.html'.format(name, page)
            with open(filename, 'w', encoding='utf-8')as f:
                f.write(html)
            # 请求速度太快,随机休眠1-3秒
            time.sleep(random.randint(1, 3))


if __name__ == '__main__':
    sider = BaiduTieba()
    sider.run()

正则表达式

re模块使用流程

# 方法一,这个是常用,re.S作用:让正则表达式. 能匹配\n
r_list = re.findall('正则表达式',html,re.S)

# 方法二
pattern = re.compile('正则表达式',html,re.S)

例子:
import re
r_list = re.findall('AB','ABCABCABCDEFG')
print(r_list)

*********************部分输出***********************
['AB', 'AB', 'AB']

思考:请写出匹配任意一个字符正则表达式

import re
r_list = re.findall('.',html,re.S)

贪婪匹配和非贪婪匹配

正则表达式分组

标签:01,url,list,爬虫,re,html,import,B5%
来源: https://www.cnblogs.com/Hi-Son/p/14260169.html