涉及知识:
    requests,xpath,csv,io写入,ThreadPoolExecutor(多线程),方法,函数,生成器,字符编码


    思路:
    在使用多线程爬取数据的时候使用单线程效率会很低所以可以使用多线程进行同时处理数据

    1. 对单个页面想要获取的数据进行分析
    2. 上线程池,多个页面同时爬取
    1. import requests,json
    2. from lxml import etree
    3. from concurrent.futures import ThreadPoolExecutor
    4. import csv
    5. url = "https://movie.douban.com/top250?start=0&filter="
    6. headers = {
    7. "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
    8. "Referer": "https://movie.douban.com/top250?start=225&filter= ",
    9. "Host": "movie.douban.com"
    10. }
    11. f = open("movice.csv", mode="w", encoding="utf-8") #创建一个文件
    12. csvwrite = csv.writer(f)
    13. def download_file(url):
    14. rsp = requests.get(url,headers=headers)
    15. html = etree.HTML(rsp.text)
    16. span = html.xpath('//*[@id="content"]/div/div[1]/ol/li') #对想要的内容进行xpath处理
    17. for i in span:
    18. a=i.xpath('./div/div[2]/div[1]/a/span/text()')
    19. a = (i.replace("\xa0/\xa0", "").replace("/", "") for i in a) #这是一个生成器,作用是将获取到的内容不需要的替换掉,要想要输出数据的时候要list()
    20. csvwrite.writerow(a) #将处理后的数据写入到文件中
    21. if __name__ == '__main__':
    22. with ThreadPoolExecutor(50) as t : #设置线程为50
    23. for i in range(0,250): #爬取范围为0-250
    24. t.submit(download_file,f"https://movie.douban.com/top250?start={i}&filter=") #通过for循环变量对网页进行反翻页
    25. print(f"线程{i}完成")
    26. print("over!!!!!!")
    27. 注意点:在创建def的时候也要先把 if __name__ == '__main__' 写好
    28. 在获取单个页面的数据的时候要注意获取方法,和获取范围
    29. 利用生成器的方法替换数据可快捷有效,注意输出