版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haoyuexihuai/article/details/82467822
1.爬取大规模数据方案
设计两个爬虫,让他们各司其职。一个负责爬取详情页面地址,保存到数据库中;一个从数据库中获取页面地址,并抓取页面详情。
2.按分页抓取时,页面停止条件,某个元素是否存在
//class为t的td标签
if soup.find('td', 't'):
3.获取页面元素时,最好是对每一个加 if 判断,防止报错
area = list(soup.select('.c_25d a')[0].stripped_strings) if soup.find_all('span', 'c_25d') else None
4.404页面的判断,查找页面存在404标识
//<script>标签src中含有404
no_longer_exist = '404' in soup.find('script', type="text/javascript").get('src').split('/')
if no_longer_exist:
pass
else:
XXX
5.页面地址的拼接,可以完全格式化
list_view = '{}{}/pn{}/'.format(channel, str(who_sells), str(pages))
6.enumerate() 函数
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据下标和数据,一般用在 for 循环当中。
path = '/Users/Hou/Desktop/walden.txt'
with open(path,'r') as f:
lines = f.readlines()
//index下标,line数据
for index,line in enumerate(lines):
data = {
'index':index,
'line' :line,
'words':len(line.split())
}
print(data)
7.prettify() 函数
基于bs4库HTML的格式输出,让html页面更友好的显示
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
print(soup.prettify())
8.map()函数
它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回
def f(x):
return x*x
print map(f, [1, 2, 3])
map()函数不改变原有的 list,而是返回一个新的 list
9.用函数传入页码
//进程函数
from multiprocessing import Pool
//下面两个是导入其他页面的方法或list
from channel_extact import channel_list //分类地址列表list
from pages_parsing import get_links_from //获取分页列表url
//用函数传入分类地址页码
def get_all_links_from(channel):
for i in range(1,100):
get_links_from(channel,i)
//主方法
if __name__ == '__main__':
//创建进程池
pool = Pool()
# pool = Pool(processes=6) 可以手动指定进程数
//使用map函数传入分类地址页码
pool.map(get_all_links_from,channel_list.split())
10.断线续传
db_urls = [item['url'] for item in url_list.find()] //列表解析式,比for循环快3-5倍。取出item中的url存入新的列表
index_urls = [item['url'] for item in item_info.find()]
x = set(db_urls)
y = set(index_urls)
rest_of_urls = x-y //差集 以后分页查询的时候从这里面取就可以了
列表解析式
它可以根据已有列表,高效创建新列表的方式。列表解析是Python迭代机制的一种应用,它常用于实现创建新的列表,返回的是一个列表,因此用在[]中
使用列表解析式生成1*1,2*2,3*3,4*4……..9*9的序列
a1 = [x*x for x in range(1,11)]
print (a1)
11.提高爬取速度
1.多核多进程
2.使用lxml库,他比Beautifulsoup快近10倍
3.使用异步非阻塞试请求
12.select
for link in soup.select('.fenlei dt a'):
item_link = link.get('href')
url_list.insert_one({'url': item_link})
print(item_link)
.fenlei dt a取出的是.fenlei下所有dt
.fenlei>dt a取出的是.fenlei下一级所有dt
13.IP代理
# http://cn-proxy.com/ 以无法访问
proxy_list = [
'http://117.177.250.151:8081',
'http://111.85.219.250:3129',
'http://122.70.183.138:8118',
]
proxy_ip = random.choice(proxy_list) # 随机获取代理ip
proxies = {'http': proxy_ip}
wb_data = requests.get(url,headers=headers,proxies=proxies)
requests.get()含有代理的参数
14.页面真实404
wb_data = requests.get(url,headers=headers)
//获取页面状态码
if wb_data.status_code == 404:
pass
else:
XXX