Python爬虫实战系列(一)-request爬取网站资源

python爬虫实战系列第一期


文章目录

  • Python爬虫实战系列(一)-request爬取网站资源
  • 前言
  • 一、request库是什么?
  • 二、观察网站
  • 三、开冲步骤
    • 1.引入库&&定义一些基本变量
    • 2.写一个基本爬取网站的方法
    • 3.写一个页面url拼接方法&&调用爬取方法
    • 4.写一个爬取源代码中链接的方法
      • python中的yield和return的区别
    • 5.程序串联调用
    • 6.得到详情网站写一个方法对内容进行抓取
    • 7.改写main函数进行一系列爬取数据
    • 8.保存数据到json
      • 写一个方法进行保存
    • 9.进行再次改写main一系列爬取保存
    • 9.修改main使用多进程加快速度
  • 总结

前言

提示:这里可以添加本文要记录的大概内容:
初步了解爬虫基本原理,现在开始尝试写第一个比较综合的案例,利用request库,本系列下一期会使用其他方法进行爬取,还会写一些js逆向的方法
提示:以下是本篇文章正文内容,下面案例可供参考

一、request库是什么?

具体百度 我称之为一个强大的库

二、观察网站


链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aixc4zUz-1654939110730)(https://img-blog.csdnimg./c7623df0bd9e46f3a626f9388203c1f3.png)]
点开一个视频检索发现是这样,目录为网站基本域名+datail/1,同理其他视频为baseurl + detail / n…

F12里面也可以看到href,拼接即可使用。
切换目录发现URL+ page/2

点开一个看里面内容,有封面,电影名字,评分,时间等等,我们爬取他们,这不是阿瑟他爸吗,哇一个小小网站有这么大的能量,阿瑟请坐,你自己敲代码写一个爬虫
好了 基本分析就这样,首先爬取源代码的网站,进行拼接之后,爬取拼接之后的网站的数据即可,注意正则表达的写法不能写错,注意逻辑,由于我没有开发经验需要注意,先手敲,就不粘贴复制了。

三、开冲步骤

1.引入库&&定义一些基本变量

代码如下(示例):

import requests
import logging
import  re
from urllib.parse import urljoinlogging.basicConfig(level=logging.INFO,format='%(asctime)s-%(levelname)s:%(message)s')
BASE_URL = 'https://xxxx。com'
TOTAL_PAGE = 10
#requests爬取网站,re进行正则表达,logging进行输出美观,urljoin进行url拼接,BASE_URL为网站主目录,TOTAL_PAGE要爬取的页数,后期可以更改进行交互行为

2.写一个基本爬取网站的方法

代码如下(示例):

def scrape_page(url):logging.info('scraping %s...',url)try:response = requests.get(url)if response.status_code ==200:return response.textlogging.error('get invalid status code %s while scraping %s',response.status_code,url )except requests.RequestException:logging.error('error occurred while scraping %s',url,exc_info=True)
# 爬取网站,code为200返回数据,否则报错,如果爬取中间过程出问题,使用requests.requestexception报错

该处使用的url网络请求的数据。


3.写一个页面url拼接方法&&调用爬取方法

由于更换下面索引会换页面,就是上面那个page/1那种,写一个拼接方法,然后直接调用上面那个爬取方法就可以爬取页面

def scrape_index(page):index_url = f'{BASE_URL}/page/{page}'return scrape_page(index_url)

4.写一个爬取源代码中链接的方法

观察源代码,搜索任意关键字,比如阿瑟父亲的霸王别鸡,
ctrl+f 搜素href,由于这个比较简单,直接正则表达a标签href class=“name”,具体代码下方

def parse_index(html):pattern = re.compile('<a.*?href="(.*?)".*?class="name">')items = re.findall(pattern,html)if not items:return []for item in items:detail_url = urljoin(BASE_URL,item)logging.info('get detail url %s',detail_url)yield detail_url

python中的yield和return的区别

return返回的是一个list列表,而yield每次调用只返回一个数值,毫无疑问,使用return空间开销比较大,尤其是操作巨量数据的时候,操作一个大列表时间开销也会得不偿失

5.程序串联调用

写了个循环然后分别爬取各个网页链接数据进行拼接之后存到detail-urls列表

def main():for page in range(1,TOTAL_PAGE + 1):index_html = scrape_index(page)detail_urls = parse_index(index_html)logging.info('detail urls %s',list(detail_urls))
if __name__ == '__main__':main()

6.得到详情网站写一个方法对内容进行抓取

这边抓取他的封面,标题,评分,类别,简介,上映时间,有点复杂使用一个一个的正则表达进行抓取

代码如下

def parse_detail(html):cover_pattern = re.compile('<div data-v-63864230="" id="detail" class="m-t">.*?<img.*?src="(.*?)".*?class="cover">',re.S)cover = re.search(cover_pattern,html).group(1).strip() if re.search(cover_pattern,html) else Nonereturn{'cover':cover}
#其中的一个cover封面提取的正则表达,其他懒得写喽,复制粘贴喽,下方附上所有代码
  cover_pattern = re.compile('class="item.*?<img.*?src="(.*?)".*?class="cover">', re.S)name_pattern = re.compile('<h2.*?>(.*?)</h2>')categories_pattern = re.compile('<button.*?category.*?<span>(.*?)</span>.*?</button>', re.S)published_at_pattern = re.compile('(\d{4}-\d{2}-\d{2})\s?上映')drama_pattern = re.compile('<div.*?drama.*?>.*?<p.*?>(.*?)</p>', re.S)score_pattern = re.compile('<p.*?score.*?>(.*?)</p>', re.S)cover = re.search(cover_pattern, html).group(1).strip() if re.search(cover_pattern, html) else Nonename = re.search(name_pattern, html).group(1).strip() if re.search(name_pattern, html) else Nonecategories = re.findall(categories_pattern, html) if re.findall(categories_pattern, html) else []published_at = re.search(published_at_pattern, html).group(1) if re.search(published_at_pattern, html) else Nonedrama = re.search(drama_pattern, html).group(1).strip() if re.search(drama_pattern, html) else Nonescore = float(re.search(score_pattern, html).group(1).strip()) if re.search(score_pattern, html) else Nonereturn {'cover': cover,'name': name,'categories': categories,'published_at': published_at,'drama': drama,'score': score}

他的这个cover正则跟我不一样,他的比较简单,我懒得一个一个找哈哈,阿瑟请坐。

7.改写main函数进行一系列爬取数据

def main():for page in range(1,TOTAL_PAGE + 1):index_html = scrape_index(page)detail_urls = parse_index(index_html)for detail_url in detail_urls:detail_html = scrape_detail(detail_url)  #扒网站源代码data = parse_detail(detail_html)    #正则抓取数据进行输出logging.info('get detail data %s',data)

运行

8.保存数据到json

import  json
from  os import  makedirs
from os.path import existsRESULTS_DIR = 'results'
exists(RESULTS_DIR) or makedirs(RESULTS_DIR)

创建目录,如果存在就直接保存,不存在就创建一个文件夹

写一个方法进行保存

def save_data(data):name = data.get('name')data_path = f'{RESULTS_DIR}/{name}.json'json.dump(data,open(data_path,'w',encodings='utf-8'),ensure_ascil = False,indent=2)

json.dump进行改变json格式,确保是文字正常输出,并且首行缩进两个字符

9.进行再次改写main一系列爬取保存

def main():for page in range(1,TOTAL_PAGE + 1):index_html = scrape_index(page)detail_urls = parse_index(index_html)for detail_url in detail_urls:detail_html = scrape_detail(detail_url)data = parse_detail(detail_html)logging.info('get detail data %s',data)logging.info('saving data to json file')save_data(data)logging.info('data saved successfully')

爬虫完成,写出很多文件

9.修改main使用多进程加快速度

import multiprocessingdef main(page):index_html = scrape_index(page)detail_urls = parse_index(index_html)for detail_url in detail_urls:detail_html = scrape_detail(detail_url)data = parse_detail(detail_html)logging.info('get detail data %s',data)logging.info('saving data to json file')save_data(data)logging.info('data saved successfully')if __name__ == '__main__':pool = multiprocessing.Pool()pages = range(1,TOTAL_PAGE + 1)pool.map(main,pages)pool.close()pool.join()

总结

request库简单进行爬取数据,还需努力,一些函数还得搜索才能进行,比如logging这些输出还不熟悉,还有yield需要看一下。。。。。。。。加油吧

审核啊我有网站的图片都删了,网站也都没出现,怎么就版权问题了??????

Python爬虫实战系列(一)-request爬取网站资源相关推荐

  1. python爬虫实战(一)--爬取知乎话题图片

    原文链接python爬虫实战(一)–爬取知乎话题图片 前言 在学习了python基础之后,该尝试用python做一些有趣的事情了–爬虫. 知识准备: 1.python基础知识 2.urllib库使用 ...

  2. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  3. Python爬虫实战之一 - 基于Requests爬取拉勾网招聘信息,并保存至本地csv文件

    Python爬虫实战之二 - 基于Requests抓取拉勾网招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于小白,本 ...

  4. 【Python爬虫实战】使用Selenium爬取QQ音乐歌曲及评论信息

    本文对使用到的技术仅做简单的介绍,若想了解更多,请前往相应的官网网站进行学习. 本文适合对爬虫相关知识接触不多的新手,主要是普及Selenium如何做爬虫,大佬请跳过. 1.Selenium简单介绍 ...

  5. python爬虫实战之百度新闻爬取

    百度新闻信息爬取 目录 百度新闻信息爬取 序言 获取在百度新闻中搜索"阿里巴巴"的网页源代码 编写正则表达式提取新闻信息 数据清洗并打印输出 实战完整代码 序言  通过对百度新闻标 ...

  6. python爬虫实战1:批量爬取网址图片

    1.爬虫基础知识 目前,爬虫的相关知识了解了以下这么多. 2.爬取图片的步骤 学习了很多视频教程,基本介绍爬虫都是主要分3步: 1.请求网页 2.解析网页 3.保存图片 3.爬虫实战 唯有实战,才能提 ...

  7. Python爬虫实战案例一:爬取猫眼电影

    背景 笔者上一篇文章<基于猫眼票房数据的可视化分析>中爬取了猫眼实时票房数据,用于展示近三年电影票房概况.由于数据中缺少导演/演员/编剧阵容等信息,所以爬取猫眼电影数据进行补充.关于爬虫的 ...

  8. Python爬虫实战,QQ音乐爬取全部歌曲

    前景介绍 最近小伙伴们听歌的兴趣大涨,网抑云综合症已经遍布各地. 咱们再来抬高一波QQ音乐的热度吧. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里 ...

  9. Python爬虫实战(三) 免登录爬取东野圭吾超话——看看你喜欢的书上榜没?

    微博爬虫可以不借助selenium,直接用Chrome下的手机端模式打开,找到其封装的json数据,即可爬取,具体步骤如下. 分析过程 以东野圭吾超话为例,网址为微博超话.进入页面后,使用Chrome ...

最新文章

  1. python第三方包安装方法(两种方法)
  2. Flutter开发之《头条 Flutter iOS 混合工程实践》笔记(54)
  3. VHDL设计交通灯控制器的课程设计
  4. 再生希尔伯特空间_向量、函数向量、再生核希尔伯特空间、核技巧
  5. html留言回复评论页面模板,HTML5实现留言和回复的页面样式
  6. Calico数据路径:IP路由和iptables
  7. 2018年第九届蓝桥杯【C++省赛B组】【第八题:日志统计】尺取法
  8. php 动态修改函数,php – 动态调用函数
  9. 延时摄影制作软件——GlueMotion for Mac支持m1
  10. au计算机内录音乐,电脑中如何使用 Audition 内录声音
  11. 用Geek Uninstaller在win10下卸载office2010
  12. 如何将时间字体LED化(类似电子表)显示
  13. [家里蹲大学数学杂志]第033期稳态可压Navier-Stokes方程弱解的存在性
  14. Win10喇叭图标出现红叉提示“未安装任何音频输出设备“
  15. 华东理工大学计算机图形答案,华东理工大学信息科学与工程学院硕士研究生导师张静...
  16. 【免费】多种方法手把手教你如何将自己做的网页做成网络链接(直接访问)
  17. USB 为什么一般选择48MHz
  18. 深度学习模型中颜色空间转换
  19. Field *****Service in com.ruoyi.web.slweb.controller.TAcceptController required a bean of type ‘com.
  20. 5.2.4 js循环小练习02 6 做学院评奖系统​ 如果数学成绩大于80分并且语文成绩大于80分,获奖学金500元。​如果数学小于30并且语文小于30分,输出重修。 两个数a、b,如果a能被b整除

热门文章

  1. 安卓基于adb命令使用和安装apk程序,程序支持自启动
  2. 台湾服务器租用注意事项
  3. adb无法识别USB设备
  4. 无法在别的计算机里显示u盘,为什么我的u盘某些一部分文件夹在一个电脑上能显示而在另一个电脑上不显示?...
  5. 知乎热榜?微博热门?爬!
  6. 用java编写天天爱消除_【C#算法实现】安卓QQ小游戏天天爱消除辅助。
  7. Dynamic Wallpaper Mac版 精美的动态壁纸
  8. 网络爬虫CSS选择器详细讲解
  9. iqooz1能用鸿蒙,IQOO Z1X和Z1对比评测_IQOO Z1X和Z1哪个值得买
  10. 【LaTeX】对多张图片的排版