php多线程抓取网页(()使用requests获取网页的源代码())

优采云 发布时间: 2022-04-13 18:22

  php多线程抓取网页(()使用requests获取网页的源代码())

  说明:requests是python的第三方HTTP(Hypertext Transfer Protocol,超文本传输​​协议)库,比python自带的网络库urllib更简单、更方便、更人性化;使用requests可以让python访问网页并获取源代码的功能;使用requests获取网页源代码,最简单的情况只需要两行代码

  # 使用requests获取源代码

import requests

source = requests.get('https:www.baidu.com').content.decode()

  1、安装请求库

  sudo apt install requests

或者

sudo pip3 install requests -i https://mirrors.aliyun.com/pypi/simple

  2、使用requests获取网页源代码2.1 GET方法

  对于使用get方法的网页,可以使用python中requests的get()方法来获取网页的源码:

  1 import requests

2 html = requests.get('网址')

3 html_bytes = html.content

4 html_str = html_bytes.decode('utf-8')

  说明:(1)第 1 行导入请求库。

  (2)第 2 行使用 get 方法获取网页并获取响应对象。

  (3)第3行使用.content属性显示bytes类型网页的源码,中文无法正常显示。

  (4)第4行将bytes类型网页的源码解析成string类型的源码,utf-8为编码格式

  代码合并

  import requests

html_str = requests.get('网址').content.decode()

  2.2 POST 方法

  对于使用post方法的网页,可以使用python中requests的post()方法来获取网页的源码:

  1 import requests

2 date = {

'key1':'value1',

3 'key2':'value2'}

4 html_formdata = requests.post('网址', data=data).content.decode()

5 # 利用formdata提交数据

  说明:(1)data 这个字典视情况而定,构建这个字典就是任务之一。

  (2)部分url提交的内容为json时,会调整post()方法的参数

  1 html_json = requests.post('URL',json=data).content.decode() # 使用json提交数据

  requests 可以自动将字典转换为 JSON 字符串

  3、 用正则表达式组合请求

  说明:通过requests获取网页源代码后,可以对源代码字符串使用正则表达式提取文本信息。

  4、多线程爬虫

  说明:(1)python语言有一个全局解释器锁(GIL),导致python的多线程是伪多线程,本质上是一个线程,但是线程间隔很短,宏观上是连续的。这个机制对 I/O 密集型操作影响不大,但对于 CPU 密集型操作,因为 CPU 只能使用一个核心,所以对性能影响很大;计算密集型程序需要使用多个进程,而 python 的多进程不受 GIL 影响。

  4.1 多处理库(多处理)

  说明:(1)multiprocessing本身是python的一个多进程库,用来处理多进程相关的操作。但是由于进程和进程不能直接共享内存和栈资源,启动的开销很大一个新的进程比线程要大得多,所以使用多线程进行爬取比使用多进程更有优势。

  (2)multiprocessing 下面有一个虚拟模块,它允许 python 线程使用各种多处理方法。

  (2)dummy下面有一个Pool类,用来实现一个线程池。这个线程池有一个map()方法,可以让线程池中的所有线程“同时”执行一个函数。

  例子:

  1 from multiprocessing.dummy import Pool

2 def calc_num(num):

3 return num*num

4 pool = Pool(5)

5 origin_num = [x for x in range(10)]

6 result = pool.map(calc_num, origin_num)

7 print(result)

  说明:线程池的map()方法接收两个参数,第一个参数是函数名,第二个参数是一个列表。

  注意:第一个参数只是函数的名称,没有括号。第二个参数是一个可迭代对象,这个可迭代对象中的每个元素都会被函数calc_num()作为参数接收。

  除了列表之外,元组、集合或字典也可以用作 map() 的第二个参数。

  4.2 开发多线程爬虫

  注意:爬虫是I/O密集型操作,尤其是在请求网页源代码时,如果使用单线程进行开发,会浪费大量时间等待网页返回,所以应用多线程- 对爬虫的线程技术可以大大提高爬虫的效率。

  例子:

   1 from multiprocessing.dummy import Pool

2 import requests

3

4 def query(url):

5 requests.get(url)

6 url_list = []

7 for i in range(100):

8 url_list.append('https://baidu.com')

9 pool = Pool(5)

10 pool.map(query, url_list)

  4.3 爬虫常用的搜索算法

  (1)深度优先搜索

  (2)广度优先搜索

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线