爬虫请求模块

模块名及导入

1、模块名:urllib.request
2、导入方式:
   1、import urllib.request
   2、from urllib import request

常用方法详解

(一)urllib.request.urlopen()方法

1.作用

  向网站发起请求并获取响应对象

2.参数

1、URL:需要爬取的URL地址
2、timeout: 设置等待超时时间,指定时间内未得到响应抛出超时异常

3.第一个爬虫程序

  打开浏览器,输入百度地址(http://www.baidu.com/),得到百度的响应

# 导入请求模块(python标准库模块)
import urllib.request

url = ‘http://www.baidu.com/‘

# 向百度发请求,得到响应对象
response = urllib.request.urlopen(url)
# 获取响应对象内容(网页源代码)
# read() -> bytes
# decode() -> string
print(response.read().decode(‘utf-8‘))

4.相应对象(response)方法

1、bytes = response.read()
    #read()结果为bytes
2、string = response.read().decode(‘utf-8‘)
    #read().decode()结果为string
3、url = response.geturl()
    #返回实际数据的url地址(重定向问题)
4、code = response.getcode()
    #返回http响应吗
# 补充
    5、string.encode()
    6、bytes.decode()

思考:网站如何来判定是人类正常访问还是爬虫程序访问???

# 向测试网站: http://httpbin.org/get 发请求,通过获取响应内容查看自己请求头
import urllib.request

url = ‘http://httpbin.org/get‘
response = urllib.request.urlopen(url)
print(response.read().decode(‘utf-8‘))

# 结果中请求头中的User-Agent竟然是: "Python-urllib/3.7"!!!!!!!!!# 我们需要重构User-Agent

(二)urllib.request.Request()

1.作用

  创建请求对象(包装请求,重构User-Agent,使程序更像正常人类请求)

2.参数

1、URL:请求的URL地址
2、headers:添加请求头(爬虫和反爬虫斗争的第一步)

3.使用流程

#1、构造请求对象(重构User-Agent)
  req = urllib.request.Reuqest(
    url=‘http://httpbin.org/get‘,
    headers={‘User-Agent‘:‘Mozilla/5.0‘}
  )
#2、发请求获取响应对象(urlopen)
  res = urllib.request.urlopen(req)
#3、获取响应对象内容
  html = res.read().decode(‘utf-8‘)

4.示例

向测试网站(http://httpbin.org/get)发起请求,构造请求头并从响应中确认请求头信息

from urllib import request

# 定义常用变量
url = ‘http://httpbin.org/get‘
headers = {‘User-Agent‘:‘Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)‘}

# 1.构建请求对象
req = request.Request(url,headers=headers)
# 2.发请求获取响应对象
res = request.urlopen(req)
# 3.读取响应对象内容
html = res.read().decode(‘utf-8‘)
print(html)

URL地址编码模块

(一)模块名及导入

# 模块名
urllib.parse
# 导入
import urllib.parse
from urllib import parse

(二)作用

  给URL地址中查询参数进行编码

编码前:https://www.baidu.com/s?wd=美女
编码后:https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3

(三)常用方法

1.urllib.parse.urlencode({dict})

(1)URL地址中 ==一个== 查询参数

# 查询参数:{‘wd‘ : ‘美女‘}
# urlencode编码后:‘wd=%e7%be%8e%e5%a5%b3‘

# 示例代码
query_string = {‘wd‘ : ‘美女‘}
result = parse.urlencode(query_string)
# result: ‘wd=%e7%be%8e%e5%a5%b3‘

(2)URL地址中 ==多个== 查询参数

from urllib import parse
query_string_dict = {
    ‘wd‘ : ‘美女‘,
    ‘pn‘ : ‘50‘
}
query_string = parse.urlencode(query_string_dict)
url = ‘http://www.baidu.com/s?{}‘.format(query_string)
print(url)

拼接URL地址的3种方式

#1、字符串相加
    baseur1 = ‘http://www.baidu.com/s?‘
    params = ‘wd=%E7xxxx&pn=20‘
    url = baseur1+params
#2、字符串格式化(占位符)
    params =‘wd=%E7xxxx&pn=20‘
    url = ‘http://www.baidu.com/s?%s‘%params
#3、format()方法
    url = ‘http://www.baidu.com/s?{}‘
    params =‘wd=%E7xxxx&pn=20‘
    url = url.format(params)

练习: 在百度中输入要搜索的内容,把响应内容保存到本地文件

from urllib import request
from urllib import parse

def get_url(word):
    baseurl = ‘http://www.baidu.com/s?‘
    params = parse.urlencode({‘wd‘:word})
    url = baseurl + params

    return url

def request_url(url,filename):
    headers = {‘User-Agent‘: ‘Mozilla/5.0‘}
    req = request.Request(url, headers=headers)
    res = request.urlopen(req)
    html = res.read().decode(‘utf-8‘)
    # 保存到本地文件
    with open(filename, ‘w‘) as f:
        f.write(html)

if __name__ == ‘__main__‘:
    word = input(‘请输入搜索内容:‘)
    url = get_url(word)
    filename = ‘{}.html‘.format(word)
    request_url(url,filename)

2.quote(string)编码

from urllib import parse

string = ‘美女‘
print(parse.quote(string))
# 结果: %E7%BE%8E%E5%A5%B3

改写之前urlencode()代码,使用quote()方法实现

from urllib import parse

url = ‘http://www.baidu.com/s?wd={}‘
word = input(‘请输入要搜索的内容:‘)
query_string = parse.quote(word)
print(url.format(query_string))

3.unquote(string)解码

from urllib import parse

string = ‘%E7%BE%8E%E5%A5%B3‘
result = parse.unquote(string)
print(result)

总结:

#1.urllib.request
    1,req=urllib.request.Request(url,headers)
    2.res= urllib.request.urlopen(req)
    3.html=res.read().decode(‘utf-8‘)
#2.res方法
    res.read()
    res.getcode()
    res.geturl()
#3.urllib.parse
    urllib.parse.urlencode({})
    urllib.parse.quote()
    urllib.parse.unquote()

案例:百度贴吧数据抓取

要求:

1、输入贴吧名称
2、输入起始页
3、输入终止页
4、保存到本地文件:  例如:赵丽颖吧-第1页.html、赵丽颖吧-第2页.html ...

实现步骤:

(1)查看是否为静态页面

  通过右键-查看网页源代码-搜索数据关键字

(2)找url规律

  第一页:http://tieba.baidu.com/f?kw=??&pn=0

  第二页:http://tieba.baidu.com/f?kw=??&pn=0

  第n页:  http://tieba.baidu.com/f?kw=??&pn=(n-1)*50

(3)获取网页内容

(4)保存(本地文件,数据库)

(5)实现代码

from urllib import request
from urllib import parse
import time
import random
from useragents import ua_list

class BaiduSpider(object):
  def __init__(self):
    self.url = ‘http://tieba.baidu.com/f?kw={}&pn={}‘

  # 获取相应内容
  def get_html(self, url):
    headers = {
      ‘User-Agent‘: random.choice(ua_list)
    }
    req = request.Request(url=url, headers=headers)
    res = request.urlopen(req)
    html = res.read().decode(‘utf-8‘)
    print(headers)
    return html

  # 解析相应内容(提取所需数据)
  def parse_html(self):
    pass

  # 保存
  def write_html(self, filename, html):
    with open(filename, ‘w‘, encoding=‘utf-8‘) as f:
      f.write(html)

  # 主函数
  def main(self):
    # 拼接每一页的地址
    # 接收用户的输入(例如贴吧名,第几页)
    name = input(‘请输入贴吧名:‘)
    begin = int(input(‘请输入起始页‘))
    end = int(input(‘请输入终止页‘))
    # url 缺两个数据: 贴名吧  pn
    params = parse.quote(name)
    for page in range(begin, end + 1):
      pn = (page - 1) * 50
      url = self.url.format(params, pn)
      filename = ‘{}-第{}页.html‘.format(name, page)

      # 调用类内函数
      html = self.get_html(url)
      self.write_html(filename, html)
      # 每爬取1个页面随机休眠1-3秒钟
      time.sleep(random.randint(1, 3))
      print(‘第%d页爬取完成‘ % page)

if __name__ == ‘__main__‘:
  start = time.time()
  spider = BaiduSpider()
  spider.main()
  end = time.time()
  print(‘执行时间:%.2f‘ % (end-start))

实现代码

ua_list = [
  ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1‘,
  ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘,
  ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50‘,
  ‘Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50‘,

]

useragents.py配置文件

正则解析模块re

(一)re模块使用流程

方法一:

  r_list=re.findall(‘正则表达式‘,html,re.S)

方法二:

  创建正则编译对象
  pattern = re.compile(r‘正则表达式‘,re.S)
  r_list = pattern.findall(html)

(二)正则表达式元字符

元字符 含义
. 任意一个字符(不包括\n)
\d 一个数字
\s 空白字符
\S 非空白字符
[] 包含[]内容
* 出现0次或多次
+ 出现1次或多次

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

import re
# 方法一
pattern = re.compile(‘.‘,re.s)
# 方法二
pattern = re.compile(‘[\s\S]‘)

(三)贪婪匹配和非贪婪匹配

贪婪匹配(默认)

1、在整个表达式匹配成功的前提下,尽可能多的匹配 *
2、表示方式:.*  .+  .?

非贪婪匹配

1、在整个表达式匹配成功的前提下,尽可能少的匹配 *
2、表示方式:.*?  .+?  .??

示例:

import re

html = ‘‘‘
<html>
    <div><p>九霄龙吟惊天变</p></div>
    <div><p>风云际会浅水游</p></div>
</html>
‘‘‘
# 贪婪匹配
pattern = re.compile(‘<div><p>.*</p></div>‘,re.S)
r_list = pattern.findall(html)
  #[‘<div><p>九霄龙吟惊天变</p></div>\n    <div><p>风云际会浅水游</p>‘]
# 非贪婪匹配
pattern = re.compile(‘<div><p>.*?</p></div>‘,re.S)
r_list = pattern.findall(html)
print(r_list)  #[‘<div><p>九霄龙吟惊天变</p>‘, ‘<div><p>风云际会浅水游</p>‘]
pattern = re.compile(‘<div><p>(.*?)</p></div>‘,re.S)
r_list = pattern.findall(html)
print(r_list)  #[‘九霄龙吟惊天变‘, ‘风云际会浅水游‘]

(四)正则表达式分组

作用: 在完整的模式中定义子模式,将每个圆括号中子模式匹配出来的结果提取出来

示例:

import re

s = ‘A B C D‘
p1 = re.compile(‘\w+\s+\w+‘)
print(p1.findall(s))
# 分析结果是什么???[‘A B‘,‘C D‘]

p2 = re.compile(‘(\w+)\s+\w+‘)
print(p2.findall(s))
# 分析结果是什么???#第一步:把()去掉,先匹配完整 [‘A B‘,‘C D‘]#第二步:提取分组()中内容 [‘A‘,‘C‘]
p3 = re.compile(‘(\w+)\s+(\w+)‘)
print(p3.findall(s))
# 分析结果是什么???# 第一步:把()去掉,先匹配完整 [‘A B‘,‘C D‘]# 第二部:提取分组()中内容 [(‘A‘,‘B‘),(‘C‘,‘D‘)]

分组总结:

1、在网页中,想要什么内容,就加()

2、先按整体正则匹配,然后再提取分组()中的内容

  如果有2个及以上分组(),则结果中以元组形式显示 [(),(),()]

练习:页面结构如下

<div class="animal">
    <p class="name">
        <a title="Tiger"></a>
    </p>
    <p class="content">
        Two tigers two tigers run fast
    </p>
</div>

<div class="animal">
    <p class="name">
        <a title="Rabbit"></a>
    </p>

    <p class="content">
        Small white rabbit white and white
    </p>
</div>

从以上html代码结构中完成如下内容信息的提取:

问题1 :[(‘Tiger‘,‘ Two...‘),(‘Rabbit‘,‘Small..‘)]
问题2 :
    动物名称 :Tiger
    动物描述 :Two tigers two tigers run fast
    **********************************************
    动物名称 :Rabbit
    动物描述 :Small white rabbit white and white

原文地址:https://www.cnblogs.com/maplethefox/p/11319952.html

时间: 2024-10-10 07:34:36

爬虫请求模块的相关文章

http请求模块

自己写了个http请求模板,方便爬虫调取.# coding:utf-8 import requests from fake_useragent import UserAgent from random import choice # 通用性http请求模块 class model_of_request: def __init__(self): self.urls = 'http://1212.ip138.com/ic.asp' self.is_active_proxy_ip = [] # 获取u

iOS开发之Socket通信实战--Request请求模块

实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncSocket来进行长连接连接和传输数据,该第三方地址:https://github.com/robbiehanson/CocoaAsyncSocket,读者可以自行google或者baidu搜索这个库的用法,网上有很多资料,而且用法不难. 在一些对Socket通信使用需求不是很高的应用中,比如需要多个i

同步发送请求模块

同步加载有两种,一个是直接加载方式,另一个是发送标准同步请求后生成页面的方式. 直接方式的实现是requestWithURL:url,这种方案基本上已经很少有人用了. 发送标准同步请求的方式就是通过sendSynchronousRequest这个函数实现. 咱们的这个标准同步请求模块是通过代理来实现,就只贴代码,步贴使用方法了. chttpSendSynchronousRequest.h文件 #import <Foundation/Foundation.h> @interface chttpS

django-rest framework 框架生命周期 请求模块 渲染模块 解析模块 异常模块 响应模块

一.DRF框架 1.安装 pip3 install djangorestframework 2.drf框架规矩的封装风格 按功能封装,drf下按不同功能不同文件,使用不同功能导入不同文件 from rest_framework.views import APIView #视图,以后都继承这个,这个也是继承views后一顿操作完善了功能 from rest_framework.response import Response #响应 from rest_framework.request impo

前后台交互ajax请求模块

下载依赖包axios npm i axios -d 最基本的axios异步请求 /* 能发送异步ajax请求的函数模块 封装 axios库 函数的返回值:是一个promise对象 (可以用.then()/ async await 进行异步处理) */ //引入axios库 import axios from 'axios'; //引入axios库的模块 export default function ajax(url, data={}, method='GET'){ if(method==='G

Python爬虫请求头解析

Python爬虫请求头解析 Accept:本次请求可以接受的内容: Accept-Encoding:可以接受的数据编码的类型: Accept-Language:可以接受的语言类型: Cookie:保存用户状态的登录状态信息(身份证): Host:保存请求的主机地址: Referer:告诉服务器从哪里来(从哪个网站过来的): See-Fetch-Mode/Site/User:用户的一些配置信息(不重要,对爬虫没有影响): Upgrade-Insecure-Request:本次请求是否安全(1为安全

vue项目常用之二:封装 axios 请求模块

/** * 封装 axios 请求模块 */ import axios from 'axios' import jsonBig from 'json-bigint' import store from '@/store' import router from '@/router' import { Notify } from 'vant' // axios.create 方法:复制一个 axios const request = axios.create({ baseURL: 'http://t

反爬虫和模块get post

urllib模块只能用get urllib2模块既有get也有post 网址url = urllib2.urlopen(' http://www.zhanjibao.com/core/search/player',data = 'nickname=%E9%9B%AA%E5%9F%9F%E6%9E%AB ')有data表示post请求 urllib2模块 request请求是反爬虫 add-header中要写成字典的形式,用逗号隔开,单引号引起两部分的内容 req = urllib2.Reques

爬虫请求库——requests

请求库,即可以模仿浏览器对网站发起请求的模块(库). requests模块 使用requests可以模拟浏览器的请求,requests模块的本质是封装了urllib3模块的功能,比起之前用到的urllib,requests模块的api更加便捷 requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求,但是selenium模块就可以执行js的操作. 安装: pip3 install requests 请求方式:主要用到的就get