首页 > 编程语言 >【练习】爬虫-基础2 - GlidedSky 源码参考!

【练习】爬虫-基础2 - GlidedSky 源码参考!

时间:2024-01-02 11:34:17浏览次数:60  
标签:thread url 爬虫 爬取 源码 Cookie GlidedSky print


前面本渣渣分享过 爬虫-基础1 - GlidedSky ,这篇就来分享 爬虫-基础2 ,希望对你有帮助吧,当然仅记录分享,为了更有帮助,这里升级了一下爬虫难度,采用了多线程。

【练习】爬虫-基础2 - GlidedSky 源码参考!_ide

本身相对于基础1,基础2提升了一下难度,从单页爬取提升到分页爬取,分成了1000个页面,需要请求一千次,而网页结构没有变化,很典型的 Bootstrap 写的样式。

【练习】爬虫-基础2 - GlidedSky 源码参考!_多线程_02

爬虫-基础2

简单的分析一下页面,尤其是分页页面请求,可以很简单的得出请求规律,那就是 ?page=2 ,其中 2 页码,只需更换页码数,即可访问所有页面。

http://glidedsky.com/level/web/crawler-basic-2

与第一篇爬取采用正则不同,这里使用本渣渣用的比较频繁的 lxml 库来获取数据,给出参考源码,供学习参考使用。

# -*- coding: utf-8 -*-
#爬虫-基础2 - GlidedSky  @公众号:eryeji
#http://glidedsky.com/level/web/crawler-basic-2
# Cookie 需自行补充填写

import requests
from lxml import etree


Cookie="" 
numbers=[]
for i in range(1,1001):
    url=f"http://glidedsky.com/level/web/crawler-basic-2?page={i}"
    print(f">> 正在爬取第{i}页..")
    headers = {
        "Cookie": Cookie,
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
    }
    html = requests.get(url=url, headers=headers, timeout=6).content.decode('utf-8')
    tree=etree.HTML(html)
    divs = tree.xpath('//div[@class="row"]/div[@class="col-md-1"]/text()')
    print(divs)
    for div in divs:
        number= int(div.strip())
        numbers.append(number)


print(len(numbers))
print(numbers)
num=sum(numbers)
print(num)

【练习】爬虫-基础2 - GlidedSky 源码参考!_爬虫_03

【练习】爬虫-基础2 - GlidedSky 源码参考!_爬虫_04

如果仅仅如此有什么意思呢,不妨可以尝试写一下多线程,异步爬取,来提升一下爬取效率,毕竟实例练手的机会也不是太多,这样才能做到举一反三!

这里给出一个多线程爬取示例做参考:

# -*- coding: utf-8 -*-
#多线程爬取 
import requests
import re
import threading

url = 'http://www.glidedsky.com/level/web/crawler-basic-2'
total_threads = 10  # 设置线程数量
lock = threading.Lock()  # 创建一个锁,用于线程间的数据同步
res = 0
Cookie=""

def worker(thread_id):
    global res
    for i in range(thread_id, 1001, total_threads):
        temp_url = url + '?page=' + str(i)
        print(f">> 开始爬取第{i}页..")
        response = requests.get(temp_url, headers=headers)
        html = response.text
        pattern = re.compile('<div class="col-md-1">.*?(\d+).*?</div>', re.S)
        n_list = re.findall(pattern, html)
        with lock:
            for n in n_list:
                res += int(n)


threads = []
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.54',
    'Cookie': Cookie
}

# 创建并启动线程
for i in range(total_threads):
    thread = threading.Thread(target=worker, args=(i,))
    thread.start()
    threads.append(thread)

# 等待所有线程执行完成
for thread in threads:
    thread.join()

print(f'Result: {res}')

更多多线程,异步爬取

参考完整源码 

关注本渣渣公众号 

【练习】爬虫-基础2 - GlidedSky 源码参考!_ide_05

后台回复“爬虫基础2”

·················END·················

你好,我是二大爷,

革命老区外出进城务工人员,

互联网非早期非专业站长,

喜好python,写作,阅读,英语

不入流程序,自媒体,seo . . .


【练习】爬虫-基础2 - GlidedSky 源码参考!_公众号_06

【练习】爬虫-基础2 - GlidedSky 源码参考!_ide_07

关注我的都变秃了

说错了,都变强了!

不信你试试

【练习】爬虫-基础2 - GlidedSky 源码参考!_爬虫_08

扫码关注最新动态

公众号ID:eryeji

标签:thread,url,爬虫,爬取,源码,Cookie,GlidedSky,print
From: https://blog.51cto.com/u_15200177/9065863

相关文章

  • 【JDK源码】String源码学习笔记
    代码运行环境:JDK8首先思考几个问题:String对象在不同的JDK中是如何实现的?String对象的不可变性是什么样的?下面这段代码的输出结果是什么?Strings1=newString("aaa")+newString("");s1.intern();Strings2="aaa";System.out.println(s1==s2);Strings3=newString("bbb......
  • 【JDK源码】Java中LinkedList的实现
    JDK版本:1.8.0_271基础介绍LinkedList底层数据结构是一个双向链表:链表的每个节点叫做Node,在Node中,prev属性表示前一个节点的位置,next属性表示后一个节点的位置first是双向链表的头节点,它的前一个节点是nulllast是双向链表的尾节点,它的后一个节点是null当链表中没有数据时,fi......
  • 【JDK源码】Java包装类的缓存是怎么回事
    JDK版本:1.8.0_271基础介绍缓存机制包装类是对Java中基本类型的封装,在JDK5中引入了包装类的缓存机制,有助于节省内存。实现方式是在类初始化的时,提前创建好会频繁使用的包装类对象,当需要使用某个类的包装类对象时,如果该对象包装的值在缓存的范围内,就返回缓存的对象,否则就创建新的......
  • 【JDK源码】ArrayList的代码实现
    JDK版本:1.8.0_271基础介绍ArrayList底层数据结构就是一个数组:index表示数组下标,从0开始计数,elementDatda表示数组本身DEFAULT_CAPACITY表示数组的初始化大小,默认是10size表示数组的大小,int类型,没有使用volatile修饰,非线程安全modCount统计当前数组被修改的版本次数,数......
  • 使用Selenium库的C#爬虫程序来爬取腾讯云的视频
    这是一个使用Selenium库的C#爬虫程序,用于爬取https://cloud.tencent.com/的视频。代码中使用了代理服务器,代理服务器的主机地址为www.duoip.cn,端口号为8000。以下是完整的代码解释://导入Selenium库usingOpenQA.Selenium;//创建一个ChromeDriver实例,使用代理服务器IWebDriver......
  • Java超高精度无线定位技术--UWB (超宽带)人员定位系统源码
    UWB室内定位技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波,而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据,从而具有GHz量级的带宽。UWB(超宽带)高精度定位系统是一种利用超宽带技术实现精确定位的解决方案。该系统使用高......
  • java中小微医疗机构云服务(云HIS)平台源码
    云HIS(Cloud-BasedHealthcareInformationSystem)重新定义了HIS,目标是为中小型医疗卫生机构提供优质经济的医疗卫生信息化产品及服务;是以健康档案为主线、以电子病历为核心、以云计算技术为基础的医疗卫生系统。云HIS作为基于云计算的B/S构架的HIS系统,为基层医疗机构(包括诊所、社区......
  • Linux内核bind系统调用源码分析
    一、环境说明内核版本:Linux3.10内核源码地址:https://elixir.bootlin.com/linux/v3.10/source(包含各个版本内核源码,且网页可全局搜索函数)二、应用层-bind()函数将socket套接字绑定指定的地址:/**sockfd:由socket函数返回的套接口描述符*sockaddr:一个指向特定于协议......
  • 【B/S架构】医院不良事件报告系统源码
    医院不良事件报告系统为医院内质量控制、患者安全关注、医疗安全不良事件方面的精细化的管理提供了平台,是等级医院评审的必备内容,评审要求医院直报系统要与卫生部“医疗安全(不良)事件报告系统”建立网络对接。不良事件报告系统源码包括护理相关事件、医疗相关事件、药件相关事件......
  • SaaS版Java基层健康卫生云HIS信息管理平台源码
    云his系统源码,系统采用主流成熟技术开发,B/S架构,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问,前后端分离,多服务协同,服务可拆分,功能易扩展。多集团统一登录患者主索引建立、主数据管理,统一对外接口管理。1.系统管理及基础数据:科室、病区、人员及其岗位、权限管理,各种基础资料......