爬虫补充学习,带Python学习2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haoyuexihuai/article/details/82467822

1.爬取大规模数据方案

设计两个爬虫,让他们各司其职。一个负责爬取详情页面地址,保存到数据库中;一个从数据库中获取页面地址,并抓取页面详情。

2.按分页抓取时,页面停止条件,某个元素是否存在

//classttd标签
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

猜你喜欢

转载自blog.csdn.net/haoyuexihuai/article/details/82467822