python简单爬虫

 安装 

pip install requests

 访问网页获取源代码

import requests
source = requests.get('https://www.baidu.com').content.deocde()

Get方式

import requests

html = requests.get('网址') 
html_bytes = html.content #二进制
html_str = html_bytes.decode() #转码

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

Post 方式

post提交的数据在请求体中,因此不能直接通过拼接url的形式访问网页资源

post提交的数据要借助data或json参数

import requests

data = [{'key':value}, ]

#用formdata提交数据
#html_str = requests.post('网址', data = data).content.decode()

#某一些网站需要用json格式数据提交
#用json提交数据
html_str = requests.post('网址', json = data).content.decode()

 示例

get
import requests
html = requests.get('https://exercise.kingname.info/exercise_requests_get.html').content.decode()
print(html)

python简单爬虫_第1张图片

import re
#正则表达式
ptn = 'title>.*?

post
import requests
data = {'name':'username', 'password':'123456'}
html = requests.post('https://exercise.kingname.info/exercise_requests_post.html', json = data).content.decode()
print(html)

python简单爬虫_第2张图片

import re
#正则表达式
ptn = 'title>.*?

多线程

multiprocessing本身是Python的多进程库,用来处理与多进程相关的操作。但是由于进程与进程之间不能直接共享内存和堆栈资源,而且启动新的进程开销也比线程大得多,因此使用多线程来爬取比使用多进程有更多的优势。

multiprocessing下面有一个dummy模块,它可以让Python的线程使用multiprocessing的各种方法。

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

示例
1.求1~10的每个数的平方并输出

一般写法

for i in range(1,11):
    print(i*i)

多线程写法

from multiprocessing.dummy import Pool

#功能函数
del calc_power2(num):
    return num*num

#开启三个线程
pools = Pool(3)
#数据源
origin_num = [i for i in range(1,11) ]

result = pool.map(calc_power2, origin_num)

print('结果为:{}'.format(result))
2.访问百度网页100次

一般写法

import time
import requests

def query(url):
    requests.get(url)

start = time.time()

for i in range(100):
    query('https://baidu.com')

end = time.time()

print('花费时间{}'.format( (end-start) ) )

多线程写法

import time
import requests
from multiprocessing.dummy import Pool

def query(url):
    requests.get(url)

start = time.time()
url_list = []
for i in range(100):
    url_list.append('https://baidu.com')
pool = Pool(10)
pool.map(query, url_list)
end = time.time()

print('花费时间{}'.format( (end-start) ) )

注意事项

python多线程在微观上是串行的,因为 总线程数 * 运行时间  > 单线程运行时间

线程池设置得过大,线程切换导致的开销可能会抵消多线程带来的性能提升。

线程池的大小需要根据实际情况来确定,并没有确切的数据。

 

你可能感兴趣的:(大数据,python,开发语言,爬虫)