前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【练习】爬虫-基础2 - GlidedSky 源码参考!

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

作者头像
二爷
发布2023-12-26 18:24:46
1421
发布2023-12-26 18:24:46
举报
文章被收录于专栏:二爷记二爷记

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

爬虫-基础2

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

代码语言:javascript
复制
http://glidedsky.com/level/web/crawler-basic-2

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

代码语言:javascript
复制
# -*- 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)

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

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

代码语言:javascript
复制
# -*- 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}')

更多多线程,异步爬取

你好,我是二大爷,

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与SEO学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 爬虫-基础2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档