php多线程抓取网页(()使用requests获取网页的源代码())
优采云 发布时间: 2022-04-13 18:22php多线程抓取网页(()使用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)广度优先搜索