了解python爬虫

本系列来源于B站视频。UP主为IT搬運工,系列视频为[小甲鱼]零基础入门学习python点我直达

什么是爬虫

又称为网页蜘蛛,在网页上获取所需要的信息。

python如何访问互联网

url + lib= urllib

URL

协议://IP地址/资源具体地址

lib

urllib

实战

爬取html

爬取网页html代码

import urllib.request
#import ssl
#ssl._create_default_https_context = ssl._create_unverified_context
response = urllib.request.urlopen("http://www.fishc.com") #网址
html = response.read()
html = html.decode("utf-8") #改为utf-8的编码
print(html) #打印消息体
print(response.info()) #打印请求信息
print(response.getcode()) #打印请求返回码

有道翻译

通过有道翻译api实现输入内容的翻译:

import urllib.request
import urllib.parse
import json

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
content = input('请输入需要翻译的内容:')
data = {'i': content, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb',
        'salt': '16103741503935', 'sign': '52bbd584e410db9268738912201819eb', 'lts': '1610374150393',
        'bv': '4f7ca50d9eda878f3f40fb696cce4d6d', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME'}

data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url, data)

html = response.read().decode('utf-8')
target = json.loads(html)
print(target["translateResult"][0][0]['tgt'])

实现结果

img

隐藏

python在进行post请求时,会将post请求的用户标识为python,因此可能会被服务器拒绝连接,所以需要修改用户标识。

head = {
    'User-Agent': '自己浏览器字段'}
req = urllib.request.Request(url, data, head)  
#以下为urlopen  #略过,见上节
#以上为urlopen
print(req.headers)
#修改http 的请求头中的User-Agent字段为自己浏览器的字段

循环翻译请求

import urllib.request
import urllib.parse
import json
import time

while True:
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'

    '''
    head = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
    Chrome/87.0.4280.88 Safari/537.36'}
    '''

    content = input('请输入需要翻译的内容:(输入"q!"退出程序)')
    if content == 'q!':
        break
    data = {'i': content, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb',
            'salt': '16103741503935', 'sign': '52bbd584e410db9268738912201819eb', 'lts': '1610374150393',
            'bv': '4f7ca50d9eda878f3f40fb696cce4d6d', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web',
            'action': 'FY_BY_REALTlME'}

    data = urllib.parse.urlencode(data).encode('utf-8')
    #req = urllib.request.Request(url, data, head)
    req = urllib.request.Request(url, data)
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
    Chrome/87.0.4280.88 Safari/537.36')
    response = urllib.request.urlopen(url, data)

    html = response.read().decode('utf-8')
    target = json.loads(html)
    print(target["translateResult"][0][0]['tgt'])
    time.sleep(3)
    #print(req.headers)

运行结果

请输入需要翻译的内容:(输入”q!”退出程序)刷漆
Brush paint
请输入需要翻译的内容:(输入”q!”退出程序)帅气
handsome
请输入需要翻译的内容:(输入”q!”退出程序)q!

进程已结束,退出代码0

代理

步骤:

1,参数时一个字典{‘类型’:‘代理ip’:‘端口号’}

proxy_support = urllib.request.ProxyHandler({})

2,定制、创建一个opener

opener = urllib.request.build_opener(proxy_support)

3a,安装opener

urllib.request.install_opener(opener)

3b,调用opener

opener.open(url)

爬取妹子图片

由于技术水平太菜外加网站做了反爬处理,所以返回403禁止访问

import urllib.request
import os


def get_html(url):
    req = urllib.request.Request(url)
    req.add_header('user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36')
    response = urllib.request.urlopen(url)
    html = response.read().decode('utf-8')
    print(html)
    return html


def find_imgs(html):
    img_addr = []
    a = html.find('img src=')

    while a != -1:
        b = html.find('.jpg', a, a + 255)
        if b != -1:
            img_addr.append(html[a+9:b+4])

        else:
            b = a+9
        a = html.find('img src=', b)

    for each in img_addr:
        print(each)
    return img_addr


def save_imgs(folder, img_addr):
    for each in img_addr:
        file_name = each.split('/')[-1]
        with open(file_name, 'wb') as f:
            img = urllib.request.openurl(each)
            f.write(img)


def download_mm(folder='OOXX', pages=10):
    #创建文件夹
    os.mkdir(folder)
    #跳转到路径
    os.chdir(folder)
    #访问链接
    url = 'https://www.mzitu.com/zipai/'
    #获取html
    html = get_html(url)

    for i in range(pages):
        #找到图片元素
        img_addr = find_imgs(html)
        #保存图片
        save_imgs(folder, img_addr)


if __name__ == '__main__':
    download_mm()

正则表达式

import re

#search 用于正则表达式查找第一次出现的位置
print(re.search(r'Moliam', 'I am Moliam'))
# .(英文句号):代表除了换行符的任何字符,所以返回0,匹配为I
print(re.search(r'.', 'I am Moliam'))
print(re.search(r'M.', 'I am Moliam'))
#加上\去除.的通配符
print(re.search(r'\.', 'I am Moliam.'))
#\d 匹配任何单个数字  数字对于字符串只有0-9
print(re.search(r'\d\d\d', 'I am Moliam.100'))
#[] 字符类:只要匹配字符类中的任何元素都算匹配,大小写敏感
print(re.search(r'[aeiou]', 'I am Moliam.100'))
# - 表示范围
print(re.search(r'[a-z]', 'I am Moliam.100'))
# {} 限定重复次数  下例中b要有且只能重复3次
print(re.search(r'ab{3}c', 'abbbc'))
# 3-10次重复  均可算匹配成功
print(re.search(r'ab{3,10}c', 'abbbc'))
#寻找字符串中的0-255  | 为逻辑或   必须写3位
print(re.search(r'[01]\d\d|2[0-4]\d|25[0-5]', '233'))
print(re.search(r'[01]\d\d|2[0-4]\d|25[0-5]', '3'))

运行结果

<re.Match object; span=(5, 11), match=’Moliam’>
<re.Match object; span=(0, 1), match=’I’>
<re.Match object; span=(5, 7), match=’Mo’>
<re.Match object; span=(11, 12), match=’.’>
<re.Match object; span=(12, 15), match=’100’>
<re.Match object; span=(2, 3), match=’a’>
<re.Match object; span=(2, 3), match=’a’>
<re.Match object; span=(0, 5), match=’abbbc’>
<re.Match object; span=(0, 5), match=’abbbc’>
<re.Match object; span=(0, 3), match=’233’>
None

菜鸟教程正则表达式的详细介绍

异常处理

URLError
HTTPError

Scrapy

提取结构性数据的框架

  • 创建一个Scrapy项目
  • 定义Item容器
  • 编写爬虫
  • 存储内容

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!