Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python爬虫入门代码案列

Python爬虫入门代码案列

作者头像
Tommonkey
发布于 2023-02-25 09:30:45
发布于 2023-02-25 09:30:45
97300
代码可运行
举报
文章被收录于专栏:TommonkeyTommonkey
运行总次数:0
代码可运行

Python爬虫入门代码案例

简介

什么是爬虫:爬虫又可以叫网络机器人,是模拟用户上网行为去爬去别人网站上的内容的一种程序或脚本。

爬虫的分类

  • 通用爬虫:抓取系统重要组成部分,抓取的是一整张页面的内容。
  • 聚焦爬虫:建立在通用爬虫的基础之上,抓取的是页面中的特定的局部内容。
  • 增量爬虫:检测网站中的数据更新情况,只会抓取网站中的最新更新出来的数据。

反爬机制:通过指定相关的策略和技术来阻止恶意的爬虫程序对网站的数爬取。

反反爬机制:爬虫程序通过相关的策略和技术来破解获知绕过目标网站的反扒机制。

robots.txt协议:规定了网站中那些数据可以爬取,那些不可以爬取,被称为君子协议,因为他只是规定了,但遵不遵守全看自觉!

爬虫基本流程

  • 指定url
  • 发起请求
  • 获取响应数据
  • 持久化存储

需要提前掌握的知识

  • python模块:requests模块
  • python模块:os模块
  • python模块:json模块
  • xpath解析方式
  • 正则表达式

简单代码案例分析

1.简单爬取搜狗整张页面并存储到本地

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests

# example-1:入门
# if __name__ == "__main__":
#     # step1:指定url
#     url1 = 'https://sogou.com/'
#     # step2:发起请求
#     response = requests.get(url=url1)
#     # step3:获取响应数据
#     page_content = response.text
#     print(page_content)
#     # step4:持久化存储
#     with open('./content.html','w',encoding='utf-8') as store:
#         store.write(page_content)
#     print("The task is complete!")

2.制作简单网页采集器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# example-2:简易的网页采集器,以搜狗为列。
#import requests
# if __name__ == "__main__":
#     url1 = 'https://sogou.com/web'
#     keywd = input("Please input your keyword:")
#     # UA 伪装
#     header1 ={
#         'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
#     }
#     # url携带的查询参数,封装到字典中
#     param1 ={
#         'query':keywd
#     }
#     # 发送请求
#     response = requests.get(url1,params=param1,headers=header1)
#     page_content = response.text
#     filename = keywd+'.html'
#     print("filename is {}".format(filename))
#     with open(filename,'w',encoding='utf=8') as store:
#         store.write(page_content)
#     print("The task is complete!")

3.爬取百度翻译搜索结果内容,观察页面可知其采用了局部刷新ajax,并采用post发送

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# example-3:百度翻译爬取,注意此次为post请求。
# import json
#import requests
# if __name__ == '__main__':
#     url1 = "https://fanyi.baidu.com/sug"  # 确保自己想查询的网址是正确的
#     header1 = {
#         'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
#     }
#     info = input('Please input your word:')
#     data1 = {
#         'kw': info
#     }
#     response = requests.post(url=url1, data=data1, headers=header1)
#     dict_obj = response.json()  # 将响应包中的json格式内容赋值给dict_obj
#     filename = info+'.json'
#     fp = open(filename,'w',encoding='utf-8')
#     json.dump(dict_obj,fp=fp,ensure_ascii=False,indent=4)  # 将dict_obj以json的格式存储到fanyi.json文件中,同时ensure_ascii设置为false。
#     print('Translation complete!')

4.爬取豆瓣电影名单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# example-4:豆瓣电影
# import json
#import requests
# if __name__ == "__main__":
#     url1 = "https://movie.douban.com/j/search_subjects"
#     # param1的参数可以改成用户输入来决定
#     param1 ={
#         'type': 'movie',
#         'tag': '热门',
#         'sort': 'recommend',
#         'page_limit': '20',
#         'page_start': '0',
#     }
#     heard1 ={
#         'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
#     }
#     response = requests.get(url=url1,params=param1,headers=heard1)
#     dic_obj = response.json()
#     info = input("Please take a filename:")
#     filename = info+'.json'
#     fp = open(filename,'w',encoding='utf-8')
#     json.dump(dic_obj,fp=fp,ensure_ascii=False,indent=4)
#     print("The task is complete!")

进阶代码案列分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests

# example-1:简单爬取网站图片
# if __name__ == "__main__":
#     url1 = "https://www.tommonkey.cn/img/ctfhub_rce/rce_1/1-1.PNG"
#     data_pic = requests.get(url=url1).content  # 图片是二进制,所以用content
#     with open('./picture.jpg','wb') as fb:
#         fb.write(data_pic)
#     print("Task is complete!")




# example-2:爬取https://www.qiushibaike.com/imgrank/,使用正则表达式截取页面特定的内容
# import re
# import os
# if __name__ == "__main__":
#     if not os.path.exists("./picture"):
#         os.mkdir("./picture")
#
#     url1 = "https://www.qiushibaike.com/imgrank/page/"
#     heared1 ={
#         'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
#     }
#     match_pic = '<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>'  # 正则表达式匹配img的url地址部分
#
#     for i in range(1,2):  # 选择下载的页数
#         new_url = url1+"{}/".format(i)
#         data_pic = requests.get(url=new_url, headers=heared1).text
#         data_pic_list = re.findall(match_pic,data_pic,re.S)
#         print("正在下载第{}页图片内容!".format(i))
#
#         n = 1
#         for p in data_pic_list:
#             pic_url = "https:"+p
#             download_pic = requests.get(url=pic_url,headers=heared1).content
#             filename = p.split("/")[-1]
#             path = "./picture/"+filename
#             with open(path,'wb') as fd:
#                 fd.write(download_pic)
#             print("第{}张图片以下载完成!".format(n))
#             n = n+1
#         print("第{}页内容下载完成.......".format(i))
#     print("The task is complete!")





# example-3:xpath解析实列,58同城爬取二手房名字信息。
# from lxml import etree
# if __name__ == "__main__":
#     url1 = "https://hf.58.com/ershoufang/p1/"
#     header1 ={
#         'User-agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
#     }
#     response_page = requests.get(url=url1,headers=header1).text
#     obj_page = etree.HTML(response_page)
#     tag_content = obj_page.xpath('//div[@class="property-content-title"]/h3/text()')
#     print(tag_content)
#     fd = open('./info.txt',"w",encoding="utf-8")
#     for n in tag_content:
#         fd.write(n+"\n")
#     print("over!")






# example-4:爬取www.bing.com的图片.
# import os
# from lxml import etree
# if __name__ == "__main__":
#     if not os.path.exists("./picture_down"):
#         os.mkdir("./picture_down")
#     url1 = "https://cn.bing.com/images/search?"
#     # 这里的参数param1可以修改,以此来获取更多的页请求
#     param1 ={
#         "q":"机甲",
#         "first":"1",
#         "tsc":"ImageBasicHover"
#     }
#     header1 ={
#         "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
#     }
#     content = requests.get(url=url1,params=param1,headers=header1).text  # 请求html页面
#     obj_content = etree.HTML(content)
#     pic_content = obj_content.xpath('//div[@id="mmComponent_images_1"]/ul/li//a[@class="iusc"]/@href')  # 是以列表的形式返回
#     pic_name = obj_content.xpath('//div[@id="mmComponent_images_1"]/ul/li//a[@class="iusc"]/@h')   # 是以列表的形式返回
#     num = 0
#     for i in pic_content:
#         pic_name_fix = pic_name[num].split(".")[-2]
#         path_name = "./picture_down/" + pic_name_fix+".jpg"  # 图片完整的保存路径,通过num来取出名字
#         #fd = open(path_name,"wb")
#         new_url = "https://cn.bing.com"+i  # 拼接成图片的url地址
#         down_pic = requests.get(url=new_url, headers=header1).content  # 以二进制请求响应并赋值给down_pic
#         with open(path_name,"wb") as fd:
#             fd.write(down_pic)
#         num = num+1
#         print("第{}张下载完成!".format(num))
# 
#     print("The task is complete!")
#     # 这里只做了一页的循环遍历下载,如果要下载很多页,只需要在此基础上在添加一个外部for循环并修改param1的参数即可
最后一个example-4通过爬虫下载下来的图片,不能正常打开,暂时没找到原因。待解决。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《王道》数据结构笔记整理2022级_数据结构笔记整理
1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。
全栈程序员站长
2022/09/22
3.2K0
《王道》数据结构笔记整理2022级_数据结构笔记整理
【数据结构】详细剖析线性表
经过这段时间的学习与分享,想必大家跟我一样都已经对线性表的相关内容比较熟悉了。为了更好的巩固线性表相关的知识点,下面我们一起将线性表这个章节的内容梳理一遍吧。
蒙奇D索隆
2024/01/01
3510
【数据结构】详细剖析线性表
线性表的链式存储结构的实现及其应用(C/C++实现)
存档----------- 1 #include <iostream.h> 2 typedef char ElemType; 3 #include "LinkList.h" 4 void main() 5 { 6 LinkList h; 7 ElemType e; 8 int i=0; 9 int t=0; 10 cout<<"(1)初始化单链表h\n"; 11 InitList(h); 12 cout<<"(2)单链表为"<<(Li
Angel_Kitty
2018/04/09
7200
线性表的链式存储结构的实现及其应用(C/C++实现)
数据结构-线性表
线性表是具有相同数据类型的n(n≥0)个数据元素的有限 序列,其中n为表长,当n = 0时线性表是一个空表。若用L命名线性表,则其一般表示为:
计蒙不吃鱼
2025/06/12
1420
数据结构-线性表
数据结构学习—线性表
线性表 线性表的概念 定义 线性表是由n(n>=0)个类型相同的数据元素组成的有限序列,数据元素之间是一对一的关系,即每个数据元素最多有一个直接前驱和一个直接后驱。 特点: 同一性:线性表必须由同类数据元素组成 有穷性:线性表由有限个数据元素组成,表长就是表中数据元素个数 有序性:线性表中相邻元素之间存在着序偶关系。 线性表的顺序存储 定义 是指用一组地址连续的存储单元依次线性表中的各个元素,使得线性表在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中。 C语言定义 #define MAXSI
用户5513909
2023/04/25
2070
数据结构学习—线性表
数据结构
注意下标的起始,线性表从1开始,而数组下标从0开始。操作数 i 是从1开始,存到数组中应该是从 i-1 开始
h3110_w0r1d
2024/02/19
2030
数据结构
单链表反转的分析及实现
我先画一个单链表,这个单链表有4个元素。我的思路就是,每次把第二个元素提到最前面来。比如下面是第一次交换,我们先让头结点的next域指向结点a2,再让结点a1的next域指向结点a3,最后将结点a2的
猿人谷
2018/01/17
2.3K0
单链表反转的分析及实现
【数据结构】C语言实现单链表的基本操作
大家好,很高兴又和大家见面啦!!! 在上一篇中,我们详细介绍了单链表的两种创建方式——头插法与尾插法,相信大家现在对这两种方式都已经掌握了。今天咱们将继续介绍单链表的基本操作——查找、插入与删除。在开始今天的内容之前,我们先通过尾插法创建一个单链表,如下所示:
蒙奇D索隆
2023/12/29
7480
【数据结构】C语言实现单链表的基本操作
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
开放式问题的解题思路: 问题: 请描述顺序表和链表的bla bla bla…实现线性表时,用顺序表还是链表好? 答案:
盛透侧视攻城狮
2024/10/22
1800
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
链表代码详解
空间动态分配,减少空间浪费 但在存取删除时需要从头结点开始遍历,时间复杂度为O(n) 插入删除操作需要修改指针
学编程的小程
2023/10/11
2000
数据结构代码题-链表
2.在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。
愷龍
2023/10/16
4820
数据结构代码题-链表
c++单链表的基本操作(全)
俩个基本插入方法 #include <bits/stdc++.h> using namespace std; typedef struct LNode { int date; //节点的数据域 struct LNode *next; //节点的指针域 }LNode,*LinkList; // LinkList 为指向结构体LNode的指针类型 bool Initlist_L(LinkList &L) //构造一个空的单链表L { L = new
莫浅子
2022/11/18
7190
c++单链表的基本操作(全)
期末复习之数据结构 第2章 线性表
#include <iostream> using namespace std; #define ElemType int #define Status int #define MAXSIZE 100 typedef struct LNode { ElemType data;//数据域 struct LNode* next;//指针域 }LNode, * LinkList; Status InitList(LinkList& L) { L = new LNode; L->next = NULL; return 1; } Status InsertList(LinkList& L, int pos, ElemType e) { LNode* s; LinkList p = L; int j = 0; while (p&&(j<pos-1)) { p = p->next; ++j; } if (!p || j > pos - 1) { return 0; } s = new LNode; s->data = e; s->next = p->next; p->next = s; return 1; } int main() { LinkList P; InitList(P); int num; cout << "请输入整数,按ctrl+z结束输入" << endl; int Length = 1; while (cin>>num) { Length++; InsertList(P, Length, num); } cout <<"单链表结点个数为:"<< Length-1 << endl; }
henu_Newxc03
2021/12/28
7610
期末复习之数据结构 第2章 线性表
《大话数据结构》线性表代码总结
//线性表存储的结构代码 #include<stdio.h> #include<stdlib.h> #include<time.h> #define MAXSIZE 1000//静态链表部分的 #define MAX_SIZE 20//最大长度 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 //线性表顺序存储结构 //自定义的类型 以描述返回状态值 typedef int Status;//Status是函数的类型,其值是函数结果的状
半生瓜的blog
2023/05/12
2400
《大话数据结构》线性表代码总结
C语言单链表实现初始化、创建、增、删、查等基本操作(详细)
LNode *L ;             //声明一个指向单链表第一个结点的指针 (强调这是一个结点用LNode*)
莫浅子
2022/11/18
1.8K0
数据结构 第4讲 单链表
链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么怎么表示逻辑上的相邻关系呢?可以给每个元素附加一个指针域,指向下一个元素的存储位置。如图所示:
rainchxy
2018/09/13
7070
数据结构 第4讲 单链表
数据结构题目总结(C 语言描述)
思路:先用层次遍历思想查找到值为 X 的结点, 然后根据其是否有左右孩子情况删除处理。如果无左孩子,直接将右子树代替它。同理如果没有右孩子,直接将左子树代替它。如果左右孩子都存在,边在左子树中找一个值最大的结点代替它。
Ewdager
2020/07/14
3.4K0
线性表的基本代码(存储结构、插入、删除)c语言
一、线性表的顺序/单链表存储的结构代码 顺序存储 #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length; }SqList; 链式存储 typedef struct Node { ElemType data; struct Node* next; }Node; typedef struct Node* LinkList; 顺序存储的插入、删除操作 Status ListI
亦小河
2022/11/14
1.3K0
关于计科专业数据结构的一些算法
还有啊,我有个个人博客,那上面的帖子更新的肯定会比公众号要快,这篇帖子也是从我博客上搬运下来的,博客上面有执行的截图,公众号没有展示,希望大家能多多关注吧!
TheMrxk
2020/05/29
7070
数据结构之线性表
所谓顺序表就是顺序存储的线性表。顺序存储是用一组地址连续的存储单元依次存放线性表中各个元素的存储结构。
C语言与CPP编程
2020/12/02
9340
数据结构之线性表
推荐阅读
相关推荐
《王道》数据结构笔记整理2022级_数据结构笔记整理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验