还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
初级爬虫教学课件Python本课程专为零基础编程初学者设计,旨在通过循序渐进的教学方式,引导学员掌握Python网络爬虫的基础知识与技能从爬虫原理到实际应用,我们将带领您一步步进入网络数据采集的世界什么是网络爬虫?网络爬虫是一种按照一定的规则,自动地抓取互联网信息的程序它通过模拟浏览器访问网站,获取网页内容,然后从中提取所需数据爬虫的工作原理可以简单概括为发送请求→获取响应→解析内容→提取数据→存储数据这一循环过程常见应用场景•搜索引擎数据收集•数据分析与挖掘•商业情报收集•社交媒体监测•学术研究数据采集爬虫的基本类型通用爬虫聚焦爬虫又称全网爬虫,目标是尽可能广泛地抓取针对特定主题或特定网站进行定向抓取的网络上的信息搜索引擎通常使用此类爬爬虫它只获取与预定义目标相关的内虫来建立网页索引,如百度、谷歌的爬虫容,大大提高了爬取效率和数据质量适系统其特点是覆盖面广但精度较低用于专题数据收集,如商品价格监控增量爬虫只抓取新产生或更新的网页内容,避免重复抓取已获取的信息通常通过记录时间戳、对比内容哈希值等方式实现增量更新,大大节省了资源消耗与网络爬虫PythonPython为何适合写爬虫•语法简洁,易于学习和维护•丰富的第三方库支持•强大的文本处理能力•完善的网络请求工具•跨平台兼容性好网络结构与HTML服务器存储网页文件并响应客户端请求,将HTML文档发送给浏览器网络传输通过HTTP/HTTPS协议在互联网上传递数据包浏览器解析HTML文档并渲染为可视化界面供用户浏览HTML(超文本标记语言)是网页的基础结构,由各种标签组成标签通常成对出现,如div和/div,它们定义了网页的各个元素爬虫需要理解这些标签的层次结构,才能准确提取所需信息协议基础HTTP请求/响应流程
1.客户端发起HTTP请求
2.服务器接收并处理请求
3.服务器返回HTTP响应
4.客户端接收并处理响应每个HTTP响应都包含状态码,如200(成功)、404(未找到)、500(服务器错误)等,爬虫需要根据状态码判断请求是否成功常用HTTP方法•GET请求获取资源,参数附在URL中•POST提交数据,参数在请求体中•HEAD只获取响应头信息•PUT上传新资源•DELETE删除资源详解URL协议主机名如http://或https://,定义了客户端和服务器之间通信的规则如www.example.com,指定了承载资源的服务器域名或IP地址端口号路径如:80或:443,指定连接服务器的端口,通常默认省略如/path/to/resource,指定服务器上资源的具体位置查询参数锚点如key1=value1key2=value2,传递给服务器的额外信息如#section1,指向页面特定部分的标记,不会发送给服务器环境准备Python安装Anaconda/MinicondaAnaconda是一个开源的Python发行版,包含了Python和大量常用第三方库,特别适合初学者Miniconda是其精简版本
1.访问官网下载适合自己系统的安装包
2.按照安装向导完成安装
3.验证安装打开命令行,输入python--versionpip与常用包管理pip是Python的包管理工具,用于安装和管理Python包•安装包pip install包名•更新包pip install--upgrade包名•卸载包pip uninstall包名•查看已安装包pip list编写第一个爬虫使用requests库是编写Python爬虫的第一步这个库可以轻松地发送HTTP请求并获取响应基本步骤
1.安装requests库pip installrequests
2.导入库import requests
3.发送请求response=requests.getURL
4.获取内容printresponse.textimport requests#发送GET请求到目标网站url=https://www.example.comresponse=requests.geturl#检查请求是否成功if response.status_code==200:#打印网页内容printresponse.textelse:print请求失败,状态码,response.status_code进阶requests1GET请求常用参数GET请求通常用于获取数据,可以通过params参数传递查询参数payload={key1:value1,key2:value2}response=requests.gethttps://example.com/search,params=payloadprintresponse.url#将显示完整的URL,包括参数2POST请求常用参数POST请求通常用于提交数据,数据通过data或json参数传递payload={username:admin,password:123456}response=requests.posthttps://example.com/login,data=payload#或者发送JSON数据response=requests.posthttps://example.com/api,json=payload3User-Agent与Headers配置模拟浏览器访问,避免被网站识别为爬虫headers={User-Agent:Mozilla/
5.0Windows NT
10.0;Win64;x64AppleWebKit/
537.36,Referer:https://example.com,Accept-Language:zh-CN,zh;q=
0.9}response=requests.gethttps://example.com,headers=headers网页内容解析介绍HTML解析需求网页爬取后,获得的是原始HTML代码,这些代码包含大量标签和非结构化文本我们需要从中提取有用信息,如标题、链接、图片URL等手动解析HTML非常困难且容易出错,因此需要专门的工具来帮助我们分析HTML结构并提取数据解析流程简述
1.获取网页HTML内容
2.使用解析工具将HTML转换为可操作的对象
3.通过选择器或路径定位目标元素
4.提取元素中的文本、属性等信息
5.处理提取的数据(清洗、格式化等)初识Beautiful Soup安装方法Beautiful Soup是Python的一个HTML/XML解析库,能够轻松地从文档中提取数据#安装Beautiful Souppip install beautifulsoup4#安装解析器pip installlxmlBeautiful Soup支持多种解析器,推荐使用lxml,它速度快且功能强大最简单解析实例from bs4import BeautifulSoupimport requests#获取网页内容response=requests.gethttps://example.comhtml=response.text#创建Beautiful Soup对象soup=BeautifulSouphtml,lxml#提取标题title=soup.title.textprint网页标题:,title核心用法Beautiful Soup1find/find_all用法2属性查询与文本获取find方法用于查找第一个匹配的标签,find_all方法用于查找所有匹配的标签可以通过标签的属性和内容来查找元素#查找第一个div标签first_div=soup.finddiv#查找所有class为#通过id属性查找header=soup.finddiv,id=header#获取标签的文content的div标签all_content_divs=soup.find_alldiv,本内容text=header.text#获取标签的属性link=soup.findaurl=class_=content#限制结果数量first_three_links=link[href]#遍历所有链接并提取URLfor link in soup.find_alla:soup.find_alla,limit=3printlink.gethref与简介lxml XPathXPath基础语法XPath是一种在XML文档中查找信息的语言,也可用于HTML文档它使用路径表达式来选择节点或节点集•选择所有元素//tagname•选择属性//tagname[@attribute=value]•选择文本//tagname/text•选择第n个元素//tagname[n]from lxmlimport etreeimport requests#获取网页内容response=requests.gethttps://example.comhtml=response.text#创建解析对象tree=etree.HTMLhtml#使用XPath提取数据titles=tree.xpath//h1/textlinks=tree.xpath//a/@href与Beautiful Soup异同正则表达式提取re库简介正则表达式是一种强大的文本模式匹配工具,Python的re模块提供了正则表达式支持常用函数•re.search查找第一个匹配•re.findall查找所有匹配•re.sub替换匹配的文本常用元字符•.点匹配任意字符•\d匹配数字•\w匹配字母、数字、下划线•*重复0次或多次•+重复1次或多次•重复0次或1次数据存储基础文本文件存储最简单的存储方式,适合少量文本数据with opendata.txt,w,encoding=utf-8as f:f.write这是要保存的数据CSV文件存储适合表格型数据,可用Excel打开import csvwith opendata.csv,w,newline=,encoding=utf-8as f:writer=csv.writerfwriter.writerow[姓名,年龄,成绩]writer.writerow[张三,18,90]JSON序列化存储适合结构化数据,便于程序读取import jsondata={name:张三,age:18,scores:[90,85,92]}withopendata.json,w,encoding=utf-8as f:json.dumpdata,f,ensure_ascii=False,indent=4编码与中文处理字符编码类型字符编码是将字符映射为二进制数据的规则常见的编码类型包括•ASCII仅支持英文和基本符号•GB2312/GBK中文编码标准•UTF-8Unicode的变长编码,支持各国语言网页采用不同编码时,爬虫需要正确识别并转换,否则会出现乱码requests的encoding设置import requestsresponse=requests.gethttps://example.com#自动检测编码printresponse.encoding#手动设置编码response.encoding=utf-8#获取正确编码的文本text=response.textprinttext请求头与反爬虫1常见Headers说明HTTP请求头包含了客户端的各种信息,网站可以通过这些信息识别爬虫•User-Agent浏览器类型和版本•Referer请求来源页面•Cookie用户身份和状态信息•Accept接受的内容类型•Accept-Language接受的语言2模拟浏览器请求原理通过设置适当的请求头,可以让爬虫请求看起来像正常浏览器访问headers={User-Agent:Mozilla/
5.0Windows NT
10.0;Win64;x64AppleWebKit/
537.36,Referer:https://example.com/index.html,Accept:text/html,application/xhtml+xml,application/xml,Accept-Language:zh-CN,zh;q=
0.9,en;q=
0.8,Accept-Encoding:gzip,deflate,br}response=requests.gethttps://example.com/data,headers=headers网站协议robotsrobots.txt作用robots.txt是一个位于网站根目录的文本文件,用于告诉爬虫哪些页面可以抓取,哪些页面不允许抓取它是一种君子协议,遵守与否取决于爬虫的设计者大型搜索引擎通常会遵守这一协议,而一些私人爬虫可能会忽略它#robots.txt示例User-agent:*#适用于所有爬虫Disallow:/private/#禁止访问/private/目录Disallow:/temp#禁止访问/temp目录Allow:/public/#允许访问/public/目录合规抓取注意事项•始终检查目标网站的robots.txt•尊重网站规定的爬取限制•控制爬取频率,避免对服务器造成负担•注意网站的服务条款和法律声明•只收集公开可见的数据,不尝试绕过身份验证请求异常与重试1常见异常类型爬虫在运行过程中可能遇到各种异常情况•ConnectionError连接错误,如DNS查询失败、拒绝连接等•Timeout请求超时•HTTPError HTTP错误,如
404、500等状态码•TooManyRedirects重定向次数过多•RequestException requests库的基本异常类2简单try/except用法使用异常处理机制可以让爬虫更加健壮import requestsfromrequests.exceptions importRequestExceptiontry:response=requests.gethttps://example.com,timeout=5response.raise_for_status#如果状态码不是200,抛出HTTPError异常printresponse.textexcept RequestException as e:printf请求发生错误:{e}#带重试机制的请求defget_with_retryurl,max_retries=3:retries=0while retriesmax_retries:try:response=requests.geturl,timeout=5return response except RequestException:retries+=1printf重试第{retries}次return None爬取动态网页基础Ajax简介Ajax(Asynchronous JavaScriptand XML)是一种在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术许多现代网站使用Ajax动态加载内容,这使得普通爬虫难以获取完整数据,因为初始HTML中并不包含这些动态加载的内容通过接口直接获取数据分析网页请求,找到Ajax数据接口,直接获取JSON数据是一种高效的爬取方式import requestsimportjson#直接请求API接口url=https://example.com/api/datapage=1headers={User-Agent:Mozilla/
5.0}response=requests.geturl,headers=headersdata=response.json#解析JSON响应#处理数据for itemindata[items]:printitem[title],item[price]自动化入门SeleniumSelenium安装Selenium是一个用于Web应用程序测试的工具,爬虫中常用它来模拟浏览器行为,处理JavaScript渲染的页面
1.安装Selenium库pipinstallselenium
2.下载对应浏览器的驱动程序(如ChromeDriver)
3.将驱动程序放在系统PATH中或指定路径浏览器驱动配置from seleniumimport webdriverfrom selenium.webdriver.chrome.service importService#指定ChromeDriver路径service=Servicepath/to/chromedriver#创建Chrome浏览器实例browser=webdriver.Chromeservice=service#或者自动查找PATH中的驱动browser=webdriver.Chrome#访问网页browser.gethttps://example.com#关闭浏览器browser.quit简单操作演示Selenium1打开网页/点击/获取内容from seleniumimport webdriverfromselenium.webdriver.common.by importBybrowser=webdriver.Chromebrowser.gethttps://example.com#点击元素button=browser.find_elementBy.ID,submit-buttonbutton.click#输入文本input_box=browser.find_elementBy.NAME,usernameinput_box.send_keystest_user#获取内容title=browser.titlecontent=browser.find_elementBy.CLASS_NAME,content.text2截屏和等待元素fromselenium.webdriver.support.ui importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions asEC#保存截图browser.save_screenshotscreenshot.png#显式等待元素加载wait=WebDriverWaitbrowser,10#最多等待10秒element=wait.until EC.presence_of_element_locatedBy.ID,result#执行JavaScriptbrowser.execute_scriptwindow.scrollTo0,document.body.scrollHeight;与Cookie SessionCookie的概念和作用Cookie是网站存储在用户浏览器中的小型文本文件,用于跟踪用户状态和个性化设置爬虫在访问需要登录的网站时,通常需要获取并使用Cookie来维持登录状态import requests#手动设置Cookiecookies={session_id:abc123,user_id:12345}response=requests.gethttps://example.com,cookies=cookiesrequests的Session对象基础Session对象可以自动处理Cookie,使多次请求之间保持状态importrequests#创建会话对象session=requests.Session#登录login_data={username:user,password:pass}session.posthttps://example.com/login,data=login_data#访问需要登录的页面,自动携带Cookieresponse=session.gethttps://example.com/profileprintresponse.text分析请求过程F12开发者工具基本用法浏览器开发者工具是分析网页结构和请求的强大工具,常用面板包括•Elements查看和修改HTML结构•Console JavaScript控制台•Network监控网络请求•Application查看Cookie、存储等在Chrome中,按F12或右键点击网页选择检查即可打开开发者工具请求链路追踪举例
1.打开Network面板并刷新页面
2.查看所有请求,筛选XHR/Fetch请求
3.点击感兴趣的请求查看详情
4.分析Headers(请求头、响应头)
5.查看Payload(请求参数)
6.查看Response(响应内容)多页面数据抓取1翻页参数模式大多数网站的分页实现方式主要有以下几种•URL中的page参数https://example.com/page=2•路径中的页码https://example.com/page/2/•Ajax加载数据通过API请求不同页的数据•加载更多按钮点击按钮加载下一页内容2自动化翻页爬取方案import requestsfrom bs4import BeautifulSoupdef get_page_dataurl,page:#构造页面URL page_url=f{url}page={page}response=requests.getpage_url soup=BeautifulSoupresponse.text,lxml#提取数据items=soup.find_alldiv,class_=item data=[]for item in items:title=item.findh
2.text.strip price=item.findspan,class_=price.text.strip data.append{title:title,price:price}return data#爬取多页数据all_data=[]forpage inrange1,6:#爬取1-5页page_data=get_page_datahttps://example.com/products,page all_data.extendpage_dataprintf已爬取第{page}页,本页{lenpage_data}条数据多线程爬虫基础threading库用法多线程可以显著提高爬虫效率,特别是在网络IO密集型任务中Python的threading库提供了线程支持import threadingimporttimedef downloadurl:printf下载{url}开始time.sleep2#模拟下载过程printf下载{url}完成#创建线程t1=threading.Threadtarget=download,args=https://example.com/1,t2=threading.Threadtarget=download,args=https://example.com/2,#启动线程t
1.startt
2.start#等待线程结束t
1.joint
2.joinprint所有下载完成简单加速理论多线程爬虫的加速主要来源于
1.并行处理多个请求,减少等待时间
2.充分利用网络带宽
3.在等待网络响应时可以处理其他任务但需要注意•线程过多可能导致资源竞争•可能触发网站的反爬措施•Python的GIL限制了CPU密集型任务的并行性框架初识ScrapyScrapy结构与优势Scrapy是一个功能强大的爬虫框架,它提供了一套完整的爬虫解决方案主要组件•Engine引擎,协调各组件工作•Scheduler调度器,管理请求队列•Downloader下载器,获取网页内容•Spider爬虫,解析网页提取数据•Pipeline管道,处理和存储数据•Middleware中间件,处理请求和响应框架应用场景Scrapy特别适合以下场景•大规模网站爬取•需要处理复杂业务逻辑•数据需要多级处理•需要高度可配置的爬虫•长期运行的爬虫项目快速体验Scrapy1新建项目/简单Spider#安装Scrapypip installscrapy#创建项目scrapy startprojectmyspider#进入项目目录cd myspider#创建爬虫scrapy genspiderexample example.com编辑生成的example.py文件,定义爬取规则import scrapyclassExampleSpiderscrapy.Spider:name=example allowed_domains=[example.com]start_urls=[http://example.com/]def parseself,response:#提取数据title=response.csstitle::text.get yield{title:title}#提取链接并跟踪for linkin response.cssa::attrhref.getall:yield response.followlink,self.parse2启动流程演示#运行爬虫scrapy crawlexample#将结果保存为JSONscrapy crawlexample-o result.json#调试模式运行scrapy shellhttp://example.com身份认证与验证码简单认证绕过实例网站认证通常有以下几种形式•Cookie认证登录后获取Cookie并保存•HTTP基本认证在URL中包含用户名和密码•Token认证获取并在请求头中包含令牌importrequests#Cookie认证session=requests.Sessionlogin_data={username:user,password:pass}session.posthttps://example.com/login,data=login_dataresponse=session.gethttps://example.com/protected#HTTP基本认证response=requests.gethttps://example.com,auth=user,pass#Token认证headers={Authorization:BearereyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ
9...}response=requests.gethttps://example.com/api,headers=headers验证码识别的思路验证码是防止爬虫的常用手段,处理方法包括
1.图像识别使用OCR技术识别简单验证码
2.第三方识别服务如超级鹰、打码兔等
3.人工识别在关键步骤手动输入验证码
4.绕过验证码寻找不需要验证码的API接口图片和多媒体资源抓取1定位图片URL使用选择器定位图片标签并提取src属性frombs4import BeautifulSoupimportrequestsresponse=requests.gethttps://example.comsoup=BeautifulSoupresponse.text,lxml#找到所有图片标签img_tags=soup.find_allimg#提取图片URLimg_urls=[img.getsrc for img inimg_tags ifimg.getsrc]2下载图片使用requests流模式下载图片,避免一次性加载大文件到内存import osimport requestsfrom urllib.parse importurljoindef download_imageurl,folder:#创建保存目录if notos.path.existsfolder:os.makedirsfolder#从URL中提取文件名filename=os.path.basenameurl#保存路径save_path=os.path.joinfolder,filename#检查文件是否已存在if os.path.existssave_path:#避免重名,添加序号name,ext=os.path.splitextfilename filename=f{name}_{inttime.time}{ext}save_path=os.path.joinfolder,filename#下载文件response=requests.geturl,stream=Truewith opensave_path,wb as f:for chunkin response.iter_contentchunk_size=1024:if chunk:f.writechunkreturn save_path常见反爬虫策略解析IP封锁与限制网站通过监控IP地址的访问频率和行为,识别并限制爬虫活动•频率限制限制单位时间内的请求次数•IP黑名单封禁异常行为的IP地址•地理位置检查限制特定区域的访问•行为分析识别非人类的访问模式数据加密和js混淆网站通过加密和混淆技术,增加数据提取的难度•动态渲染使用JavaScript生成内容•字体加密使用自定义字体映射文字•CSS偏移使用CSS改变显示位置•数据接口加密加密API返回的数据•蜜罐陷阱设置诱饵链接识别爬虫反反爬虫基础方法User-Agent池构建代理IP轮换原理通过随机切换不同的浏览器标识,降低被识别的风险通过不同的代理服务器发送请求,避免单一IP被封锁import randomuser_agents=[Mozilla/
5.0Windows NT
10.0;Win64;proxies=[{http:http://
10.
10.
1.10:3128,https:x64AppleWebKit/
537.36,Mozilla/
5.0Macintosh;Intel MacOS Xhttps://
10.
10.
1.10:1080},{http:http://
10.
10.
1.11:3128,10_15_7AppleWebKit/
605.
1.15,Mozilla/
5.0X11;Linux x86_64https:https://
10.
10.
1.11:1080},{http:AppleWebKit/
537.36,Mozilla/
5.0iPhone;CPU iPhoneOS14_7_1like http://
10.
10.
1.12:3128,https:https://
10.
10.
1.12:1080}]defMac OSX AppleWebKit/
605.
1.15]def get_random_ua:return get_random_proxy:return random.choiceproxiesproxy=random.choiceuser_agentsheaders={User-Agent:get_random_proxyresponse=requests.gethttps://example.com,get_random_ua}response=requests.gethttps://example.com,proxies=proxyheaders=headers延迟与速率控制time.sleep合理设定通过添加延迟,使爬虫行为更像人类浏览,减少被检测的可能import timeimportrandomimport requestsurls=[https://example.com/page1,https://example.com/page2]for urlin urls:#添加随机延迟,模拟人类浏览行为delay=random.uniform1,5#1-5秒随机延迟printf等待{delay:.2f}秒time.sleepdelay#发送请求response=requests.geturl printf访问{url}完成自适应限速案例根据网站响应动态调整爬取速度,避免被封锁def adaptive_rate_limitresponse,base_delay=1:根据响应状态动态调整延迟#如果响应正常if response.status_code==200:return base_delay#如果遇到429(请求过多)if response.status_code==429:return base_delay*2#加倍延迟#其他错误情况return base_delay*
1.5delay=1#初始延迟for urlin urls:response=requests.geturl#动态调整下一次请求的延迟delay=adaptive_rate_limitresponse,delay printf下一次延迟:{delay}秒time.sleepdelay数据清洗基础1pandas初步介绍pandas是Python中强大的数据分析工具,适合处理表格型数据import pandas as pd#创建DataFramedata=[{title:商品1,price:¥
199.00,sales:2342},{title:商品2,price:¥
99.50,sales:1234},{title:商品1,price:¥
199.00,sales:2342}#重复数据]df=pd.DataFramedata#查看数据printdf.head2简单数据去重与格式化#去除重复行df=df.drop_duplicates#清理价格数据,去除货币符号并转换为数值df[price]=df[price].str.replace¥,.astypefloat#将销量转换为整数df[sales]=df[sales].astypeint#排序df=df.sort_valuessales,ascending=False#保存处理后的数据df.to_csvcleaned_data.csv,index=Falsedf.to_excelcleaned_data.xlsx,index=False持久化与数据库存储sqlite、MySQL写入演示数据库存储适合大量结构化数据的长期保存和查询import sqlite3import pandas as pd#SQLite存储conn=sqlite
3.connectdata.dbcursor=conn.cursor#创建表cursor.executeCREATE TABLEIF NOTEXISTS productsid INTEGERPRIMARYKEY AUTOINCREMENT,title TEXT,price REAL,sales INTEGER#插入数据data=[商品1,
199.0,2342,商品2,
99.5,1234]cursor.executemanyINSERT INTOproducts title,price,sales VALUES,,,data#提交事务conn.commitconn.close#使用pandas直接写入数据库df=pd.DataFramedata,columns=[title,price,sales]df.to_sqlproducts,conn,if_exists=append,index=False与文件存储对比特性数据库存储文件存储数据量适合大数据量适合小数据量查询能力强大的查询语言需要自行处理并发访问支持多进程并发容易发生冲突复杂度需要数据库知识简单易用可移植性依赖数据库系统易于分享和移动模块化和函数复用请求模块配置模块封装网络请求功能,处理重试、代理等通用逻辑存储全局配置参数,如URL、请求头、数据库连接信息等#requester.pyimport requestsimportrandomimport timefromconfig importHEADERSdef make_requesturl,retries=3,delay=1:#config.pyBASE_URL=https://example.comHEADERS={User-Agent:Mozilla/
5.0Windows NT
10.0;Win64;x64发送请求,带重试机制for iin rangeretries:try:response=requests.geturl,headers=HEADERS,AppleWebKit/
537.36}DB_CONFIG={host:localhost,database:scraper_db,user:root,password:timeout=10response.raise_for_status return responseexceptExceptionase:password}printf请求失败:{e},重试{i+1}/{retries}time.sleepdelay*i+1#递增延迟return None存储模块解析模块处理数据的存储和检索功能提供各种解析函数,从HTML中提取数据#storage.pyimport pandasas pdfromsqlalchemy importcreate_enginefrom configimport DB_CONFIGdef save_to_csvdata,#parser.pyfrom bs4import BeautifulSoupdefparse_product_listhtml:解析产品列表页面soup=BeautifulSouphtml,filename:保存数据到CSV文件df=pd.DataFramedata df.to_csvfilename,index=False,encoding=utf-8lxml products=[]items=soup.find_alldiv,class_=product-item for iteminitems:product=printf数据已保存到{filename}def save_to_databasedata,table_name:保存数据到数据库df=pd.DataFramedata{title:item.findh
3.text.strip,price:item.findspan,class_=price.text.strip,#创建数据库连接engine=url:item.finda[href]}products.appendproduct returnproducts create_enginefmysql+pymysql://{DB_CONFIG[user]}:{DB_CONFIG[password]}@{DB_CONFIG[host]}/{DB_CONFIG[database]}#写入数据库df.to_sqltable_name,engine,if_exists=append,index=False printf数据已保存到数据库表{table_name}抓取示例新闻网站1分析入口和目标内容新闻网站通常有明确的栏目结构和分页机制,便于爬虫按照类别和时间顺序抓取目标内容通常包括•新闻标题•发布时间•作者/来源•正文内容•评论数量•图片链接常见抓取策略
1.从首页或栏目页获取新闻列表
2.提取新闻链接并访问详情页
3.解析详情页获取完整内容
4.按照发布时间过滤,只抓取新内容
5.保存数据,包括图片和附件importrequestsfrombs4import BeautifulSoupimportpandasaspdfrom datetimeimport datetimedefget_news_listurl:获取新闻列表response=requests.geturl soup=BeautifulSoupresponse.text,lxml news_items=soup.find_alldiv,class_=news-item news_list=[]foritemin news_items:news={title:item.findh
3.text.strip,date:item.findspan,class_=date.text.strip,url:item.finda[href]}news_list.appendnews returnnews_listdef get_news_detailurl:获取新闻详情response=requests.geturl soup=BeautifulSoupresponse.text,lxml title=soup.findh
1.text.strip date=soup.findspan,class_=date.text.strip author=soup.findspan,class_=author.text.strip content=soup.finddiv,class_=article-content.text.strip return{title:title,date:date,author:author,content:content,url:url}抓取示例商品价格21目标分析抓取电商网站商品价格时,通常需要关注以下元素•商品ID和链接•商品名称和描述•价格和折扣信息•库存状态•评分和评论数2接口分析电商网站通常使用Ajax加载价格数据,需要通过开发者工具找到数据接口
1.打开浏览器开发者工具的Network面板
2.在网页上执行价格相关操作(如选择规格)
3.在Network面板中筛选XHR请求
4.找到包含价格数据的请求
5.分析请求参数和响应格式3实现方案import requestsimportjsonimport timeimportpandasaspddef get_product_priceproduct_id:获取单个商品价格url=fhttps://example.com/api/product/price params={id:product_id,timestamp:inttime.time*1000}headers={User-Agent:Mozilla/
5.0Windows NT
10.0;Win64;x64AppleWebKit/
537.36,Referer:fhttps://example.com/product/{product_id}.html}response=requests.geturl,params=params,headers=headers data=response.jsonif data[code]==200:return{product_id:product_id,price:data[data][price],original_price:data[data][originalPrice],discount:data[data][discount],stock:data[data][stock],update_time:time.strftime%Y-%m-%d%H:%M:%S}return None#批量获取价格product_ids=[1001,1002,1003,1004,1005]results=[]for pidinproduct_ids:price_data=get_product_pricepid ifprice_data:results.appendprice_data time.sleep1#添加延迟#保存结果df=pd.DataFrameresultsdf.to_csvproduct_prices.csv,index=False抓取示例文档批量下载3批量下载PDF/文档方法批量下载文档需要首先获取文档链接列表,然后有序下载每个文件import requestsimportosimport timefrombs4import BeautifulSoupfromurllib.parse importurljoin,urlparsedefdownload_fileurl,folder:下载文件到指定文件夹#创建保存目录if notos.path.existsfolder:os.makedirsfolder#提取文件名parsed_url=urlparseurl filename=os.path.basenameparsed_url.path#如果文件名为空,使用时间戳作为文件名if notfilename:filename=fdocument_{inttime.time}.pdf#文件保存路径save_path=os.path.joinfolder,filename printf正在下载{url}到{save_path}#下载文件response=requests.geturl,stream=True#检查是否成功if response.status_code==200:with opensave_path,wb asf:for chunkin response.iter_contentchunk_size=8192:if chunk:f.writechunkprintf下载完成:{filename}return Trueelse:printf下载失败:{response.status_code}return False文件存储规范defget_document_linksurl:获取页面上的文档链接response=requests.geturl soup=BeautifulSoupresponse.text,lxml#查找所有PDF链接links=[]for ain soup.find_alla:href=a.gethref ifhref andhref.endswith.pdf orhref.endswith.doc orhref.endswith.docx:#转换为绝对URL full_url=urljoinurl,href links.appendfull_url returnlinks#主程序base_url=https://example.com/documents/download_folder=downloads#获取文档链接doc_links=get_document_linksbase_urlprintf发现{lendoc_links}个文档#批量下载fori,linkinenumeratedoc_links:printf处理第{i+1}/{lendoc_links}个文档download_filelink,download_folder time.sleep2#添加延迟,避免服务器过载项目调试与问题排查日志记录与异常捕获使用Python的logging模块记录爬虫运行状态,便于排查问题import logging#配置日志logging.basicConfig level=logging.INFO,format=%asctimes-%levelnames-%messages,filename=scraper.log,filemode=adef scrape_pageurl:try:logging.infof开始抓取:{url}response=requests.geturl response.raise_for_statuslogging.infof抓取成功:{url}returnresponse.text except requests.HTTPError ase:logging.errorfHTTP错误:{e}exceptrequests.ConnectionError ase:logging.errorf连接错误:{e}exceptrequests.Timeout ase:logging.errorf请求超时:{e}exceptException ase:logging.exceptionf未知错误:{e}return None常见调试技巧•使用print语句打印关键变量•保存中间结果到文件•使用pdb调试器设置断点•分段运行,逐步确认功能•添加超时设置避免程序卡死#调试技巧示例import pdbdefdebug_scraper:url=https://example.com#保存原始响应response=requests.geturl withopendebug_response.html,w,encoding=utf-8asf:f.writeresponse.text#设置断点pdb.set_trace#分析响应soup=BeautifulSoupresponse.text,lxml items=soup.find_alldiv,class_=item printf找到{lenitems}个项目debug_scraper云服务器与部署入门爬虫上云的理由将爬虫部署到云服务器有以下优势•24小时不间断运行•更稳定的网络环境•避免本地电脑资源占用•可使用不同地区的IP•方便团队协作与数据共享Ubuntu安装爬虫环境#更新系统sudo aptupdatesudo aptupgrade-y#安装Python和pipsudo aptinstall python3python3-pip-y#安装虚拟环境sudo aptinstallpython3-venv-y#创建虚拟环境python3-m venvscraper_env#激活虚拟环境source scraper_env/bin/activate#安装依赖包pipinstall requestsbeautifulsoup4pandas lxmlselenium#安装Chrome和ChromeDriver(如需使用Selenium)sudo aptinstall chromium-browser chromium-chromedriver-y下爬虫运行Linux1crontab定时任务使用crontab设置定时任务,让爬虫按计划自动运行#编辑crontabcrontab-e#每天凌晨2点运行爬虫02***cd/home/user/scraper/home/user/scraper_env/bin/python scraper.py/home/user/scraper/log.txt21#每周一和周四中午12点运行012**1,4cd/home/user/scraper/home/user/scraper_env/bin/python scraper.py#每小时运行一次0****cd/home/user/scraper/home/user/scraper_env/bin/python scraper.py2nohup、screen基础使用nohup或screen在后台运行爬虫,即使关闭终端也能继续运行#使用nohupnohup python scraper.pyoutput.log#查看后台进程ps aux|grep python#终止进程kill PID#使用screen创建会话screen-S scraper#在screen会话中运行爬虫pythonscraper.py#分离会话(Ctrl+A,然后按D)#重新连接会话screen-r scraper#列出所有会话screen-ls伦理与法律合规数据隐私与使用规范爬虫获取的数据可能涉及隐私和版权问题,需注意以下规范•不抓取未公开或需要登录的数据•尊重网站声明的版权信息•不采集个人隐私数据•遵守数据使用范围的限制•数据分析结果要匿名化处理•获取授权再商业使用数据反爬虫处罚风险举例违反网站规则或法律的爬虫行为可能面临的风险•IP被永久封禁•账号被封停•接到网站的律师函•面临民事赔偿要求•严重情况可能触犯法律•侵犯著作权•侵犯商业秘密•违反网络安全法•非法获取个人信息综合案例项目讲解需求分析明确爬取目标、数据结构和预期用途,确定爬取频率和存储方式技术选型根据网站特点选择合适的爬虫框架和工具,准备开发环境爬虫开发构建爬虫核心功能,包括请求、解析、数据清洗和存储优化调整添加错误处理、代理池、限速等机制,提高爬虫的稳定性部署运行将爬虫部署到服务器,设置定时任务,配置监控和报警一个完整的爬虫项目应包含配置文件、爬虫核心代码、数据处理模块、存储模块、日志模块和部署脚本等良好的项目结构和文档能大大提高代码的可维护性和可扩展性课程习题与巩固练习基础实操题目
1.使用requests和BeautifulSoup抓取百度首页的所有链接
2.编写一个爬虫提取豆瓣电影Top250的电影名称、评分和简介
3.使用正则表达式从网页中提取所有电子邮件地址
4.实现一个多线程爬虫,同时抓取多个网页
5.编写一个自动翻页的爬虫,抓取论坛的多页内容
6.使用Selenium模拟登录一个网站
7.构建一个简单的图片下载器,批量保存网页上的图片
8.实现数据增量更新,只抓取新发布的内容分析实际网站抓包选择一个实际网站,使用浏览器开发者工具分析其数据加载方式
1.观察页面加载过程中的网络请求
2.找出关键数据的来源(HTML还是API)
3.分析请求参数和响应格式
4.尝试在Python中重现这些请求
5.提取并清洗目标数据进阶学习建议推荐权威书籍
1.《Python网络数据采集》(Web Scrapingwith Python)-Ryan Mitchell著
2.《精通Python爬虫框架Scrapy》-Michael Heydt著
3.《Python3网络爬虫开发实战》-崔庆才著
4.《数据科学从基础到实践》-John D.Kelleher等著
5.《Python网络编程》(Foundations ofPython NetworkProgramming)-Brandon Rhodes著
6.《HTTP权威指南》(HTTP:The DefinitiveGuide)-David Gourley著国内外经典爬虫项目资源•Scrapy官方文档和教程•GitHub上的开源爬虫项目常见问题答疑爬虫一直被封怎么办?如何爬取渲染的页面?IP JS控制请求频率,添加随机延迟;使用代理IP池轮换请求;模拟真实浏方法一使用Selenium或Playwright等浏览器自动化工具;方法览器行为,设置合理的User-Agent和Referrer;尝试减少并发数二分析网络请求,直接获取Ajax数据;方法三使用无头浏览器如量;考虑使用付费代理服务PyPuppeteer;方法四使用专门的JS渲染服务如Splash验证码如何处理?如何提高爬虫效率?简单验证码可使用OCR库如Tesseract识别;复杂验证码可使用机器使用异步编程(asyncio)或多线程;优化网页解析逻辑;实现分布学习模型或付费打码服务;某些情况下可绕过验证码,寻找API接式爬虫;使用缓存减少重复请求;优化数据存储策略,批量写入;减口;或使用Selenium保持登录状态,避免频繁验证少不必要的数据处理如何维护大型爬虫项目?爬虫合法边界在哪里?模块化设计,分离关注点;完善的日志和监控系统;自动化测试;定遵守robots.txt协议;不爬取需要身份验证的内容;不破解网站安全期代码重构;良好的文档;使用版本控制;构建管理后台,便于配置措施;不过度请求影响服务器;注意数据使用的版权问题;不抓取个和监控人隐私信息;商业使用前咨询法律顾问课程核心知识点回顾网络基础基础PythonHTTP协议、请求/响应机制、URL结构、Python语法、数据类型、函数、模块、面向HTML/CSS基础、浏览器工作原理、网络请求对象编程、异常处理、文件操作、包管理分析爬虫工具实战经验Requests、BeautifulSoup、lxml、正则项目规划、架构设计、调试技巧、性能优表达式、Selenium、Scrapy框架、多线程化、异常处理、部署运维、合规操作与异步编程反爬与应对数据处理常见反爬措施、User-Agent池、代理IP、验证数据提取、清洗、转换、存储(文件、数据码处理、动态页面渲染、请求频率控制库)、数据分析基础、数据可视化入门课后讨论与交流学员成果展示/评比通过本课程的学习,学员们已经掌握了基础的Python爬虫技能我们鼓励大家•在课程讨论区分享自己的爬虫项目•参与每月的爬虫挑战赛•加入学习小组,互相帮助解决问题•将爬虫项目添加到个人作品集•参与开源爬虫项目的贡献下一步学习和发展方向完成基础爬虫学习后,可以向这些方向发展
1.数据分析方向学习pandas、numpy、数据可视化
2.机器学习方向将爬取的数据用于模型训练
3.全栈开发结合前后端技术构建完整系统
4.自动化测试将爬虫技能用于网站测试
5.网络安全深入研究Web安全与渗透测试
6.分布式系统构建大规模爬虫集群。
个人认证
优秀文档
获得点赞 0