爬虫day3

爬虫如何提高效率?

我们可以选择多线程,多进程,协程等操作完成异步爬取。

异步:把一个变成多个

线程:执行单位

进程:资源单位,每一个进程至少有一个线程

if name == 'main':

print("nihao")

相当于一个线程。

多线程

可以看到打印的是有两个,

mainfunc 921958

一个线程只打印一对,加入了一个线程后打印两对,有两个线程在工作。

原理:使用Thread库

第二个使用class类去继承

复制代码
from threading import Thread

class MyThread(Thread):
    def run(self):
        for i in range(1000):
            print("子线程", i)

if __name__ == '__main__':
    t = MyThread()
    t.start()
    for i in range(1000):
        print("主线程", i)

运行结果:

可以看到混在一起了,完成了多线程的操作。

多进程

使用class一样。

线程池和进程池

线程池:一次性开辟一些线程,我们用户直接给线程池提交任务。线程任务的调度交给线程池来完成。

复制代码
#线程池:一次性开一些线程,我们用户直接给线程池子提交任务,线程任务的调度交给线程池来完成
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
def fn(name):
    for i in range(1000):
        print(name,i)

if __name__ == '__main__':
# 创建线程池
    with ThreadPoolExecutor(50) as t:
        for i in range(100):
            t.submit(fn, name=f"线程{i}")
            #等待线程池中的任务全部执行完毕,才继续执行(守护)

    print("123")

输出:

进程池

实战
  1. 如何提取单个页面的内容。

2 .上线程池,多个页面同时抓取。

复制代码
import requests
from lxml import etree
import csv
from concurrent.futures import ThreadPoolExecutor

f = open("da.csv", mode="w", encoding='utf-8')
csvwriter = csv.writer(f)

def download_one_page(url):
    resp = requests.get(url)
    # print(resp.text)
    html = etree.HTML(resp.text)
    table = html.xpath("/html/body/div[2]/div[4]/div[1]/table")[0]
    trs = table.xpath("./tr[position()>1]")
    # 拿到每个str
    for tr in trs:
        txt = tr.xpath("./td/text()")
        txt = (item.replace("\\", "").replace("/", "") for item in txt)
        # 把数据存储到文件中
        csvwriter.writerow(txt)
    print(url, "提取完毕!")





if __name__ == '__main__':
    # for i in range(1, 14870):
     # download_one_page(f"http://www.xinfadi.com.cn/marketanalysis/0/list/{i}.shtml")

     with ThreadPoolExecutor(50) as t:
         for i in range(1, 200):
             t.submit(download_one_page, f"http://www.xinfadi.com.cn/marketanalysis/0/list/{i}.shtml")

     print("全部下载完毕!")

但是现在这个网址的话访问不了了,这个网址把数据改成客户端渲染了,在源代码是没有数据的,而且是通过post提交来改变页数,只要能够爬取一页数据,就可以多线程来爬取。

相关推荐
Luck_ff081029 分钟前
【Python爬虫详解】第四篇:使用解析库提取网页数据——BeautifuSoup
开发语言·爬虫·python
天天扭码8 小时前
什么?2025年了还在写传统爬虫!来试试更有爽感的AI爬虫 ψ(`∇´)ψ
爬虫·node.js·ai编程
梯度寻优者_超9 小时前
获取房源信息并完成可视化——网络爬虫实战1
爬虫
MinggeQingchun20 小时前
Python - 爬虫-网页解析数据-库lxml(支持XPath)
爬虫·python·xpath·lxml
kadog1 天前
PubMed PDF下载 cloudpmc-viewer-pow逆向
前端·javascript·人工智能·爬虫·pdf
nongcunqq1 天前
爬虫练习 js 逆向
笔记·爬虫
一个天蝎座 白勺 程序猿1 天前
Python爬虫(5)静态页面抓取实战:requests库请求头配置与反反爬策略详解
开发语言·爬虫·python
iuhart1 天前
chromedp 反反爬设计方案
爬虫
橘猫云计算机设计1 天前
net+MySQL中小民营企业安全生产管理系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·后端·爬虫·python·mysql·django·毕业设计
爱吃泡芙的小白白1 天前
爬虫学习——使用HTTP服务代理、redis使用、通过Scrapy实现分布式爬取
redis·分布式·爬虫·http代理·学习记录