多线程爬取数据

目标 

aHR0cHMlM0EvL3d3dy56b25naGVuZy5jb20vcmFuay9kZXRhaWxzLmh0bWwlM0ZydCUzRDUlMjZkJTNEMSUyNnAlM0Qy

来到页面

先请求再说

import requests

def dowmload_one_page(url):
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}
    resp = requests.get(url=url,headers=header)
    print(resp.text)

if __name__ == '__main__':
    dowmload_one_page('https://www.xxxxxxxx.com/rank/details.html?rt=5&d=1&p=2')

 没有乱码,然后到页面分析去

所有的学习都在这个大的div里面

 

 拉到最后面会看到俩个没有用的div,可以去掉

导入库

from lxml import etree

定位到列表

html = etree.HTML(resp.text)
    div_list = html.xpath('/html/body/div[2]/div[4]/div[2]/div[3]')[0]  # 加个0给它整成列表
    divs = div_list.xpath('./div')[:-2]  # 后面多了来个列表,不是需要的
    print(len(divs))

 

一共有20个

 

全部提取出来

保存一下

 

import requests,csv
from lxml import etree
f = open("da.csv",mode="w", encoding="utf-8")
csvwriter = csv.writer(f)
def dowmload_one_page(url):
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}
    resp = requests.get(url=url,headers=header)
    # print(resp.text)
    html = etree.HTML(resp.text)
    div_list = html.xpath('/html/body/div[2]/div[4]/div[2]/div[3]')[0]  # 加个0给它整成列表
    divs = div_list.xpath('./div')[:-2]  # 后面多了来个列表,不是需要的
    # print(len(divs))
    for div in divs:
        name = div.xpath('./div/div/a/text()')
        csvwriter.writerow(name)
        # print(name)
    print("保存完成")
if __name__ == '__main__':
    dowmload_one_page('https://www.xxxx.com/rank/details.html?rt=5&d=1&p=2')

 回到页面,可以看到一共是10页,如果是这样改代码

if __name__ == '__main__':
        for i in range(1,11):
            dowmload_one_page ('https://www.xxx.com/rank/details.html?rt=5&d=1&p={i}')
    

的话,会发现效率很低,贼慢,如果需要爬的页面很多的那种的话,可以挂电脑去看电视了,还有可能会出错,这时候我们就需要线程池

导入库

from concurrent.futures import ThreadPoolExecutor

修改代码如下

if __name__ == '__main__':
    with ThreadPoolExecutor(50) as t:  
        for i in range(1,11):
            t.submit(dowmload_one_page, f'https://www.xxxx.com/rank/details.html?rt=5&d=1&p={i}')
    print("全部下载完毕")

ThreadPoolExecutor(50)的意思是创建50个线程池,t.submit呢是把任务交给线程池

运行后瞬间完成,如果是单独的for循环估计要好几秒

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python的多线程模块`threading`来实现多线程爬取数据,并使用`csv`模块将数据写入CSV文件。 以下是一个示例代码,用于爬取豆瓣电影Top250的电影名称、评分和链接,并将数据写入CSV文件中。 ```python import requests import csv import threading from bs4 import BeautifulSoup def get_movie_info(start): url = f'https://movie.douban.com/top250?start={start}' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') movie_list = soup.find(class_='grid_view').find_all('li') for movie in movie_list: title = movie.find(class_='title').text rating = movie.find(class_='rating_num').text link = movie.find('a')['href'] movie_info = [title, rating, link] write_to_csv(movie_info) def write_to_csv(movie_info): with open('douban_top250.csv', 'a', newline='', encoding='utf-8-sig') as f: writer = csv.writer(f) writer.writerow(movie_info) if __name__ == '__main__': threads = [] for i in range(0, 250, 25): t = threading.Thread(target=get_movie_info, args=(i,)) threads.append(t) t.start() for t in threads: t.join() ``` 在上面的代码中,我们首先定义了一个`get_movie_info`函数用于爬取每一页的电影信息。在函数中,我们使用`requests`模块发送HTTP请求,获取网页的HTML源代码,并使用`BeautifulSoup`模块解析HTML文档,获取电影名称、评分和链接信息。 然后,我们定义了一个`write_to_csv`函数用于将获取到的电影信息写入CSV文件中。使用`csv`模块的`writer`函数将电影信息写入CSV文件。 在`if __name__ == '__main__':`中,我们创建了一个线程列表,并循环创建线程,每个线程负责爬取一页电影信息。我们使用`threading.Thread`函数创建线程,将`get_movie_info`函数作为线程的目标函数,并将页码作为参数传递给函数。 然后,我们循环启动所有线程,等待所有线程完成后再退出程序。使用`join`函数等待所有线程完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值