还剩28页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
通用爬虫教学课件什么是网络爬虫网络爬虫是一种自动抓取互联网数据的软件或脚本,它能够根据预设规则自动访问网页,获取所需信息,并将数据保存下来供后续分析使用随着互联网的快速发展,全球数据量呈现爆炸式增长据统计,互联网数据体量每年以40%以上的速度增长,这意味着全球数据总量约每两年就会翻一番在大数据时代,各行业的数据分析工作有超过90%依赖于从非结构化网页中抓取的数据这些数据成为企业决策、市场分析、学术研究的重要基础爬虫技术作为获取这些海量数据的关键工具,已经成为数据科学家、开发工程师必备的技能之一从简单的数据抓取到复杂的分布式爬虫系统,网络爬虫在各个领域都有广泛应用自动化数据采集无需人工操作,可以24小时不间断工作,高效获取海量数据高速数据处理现代爬虫系统可以并发处理成千上万个网页,速度远超人工收集定制化数据结构爬虫的主要应用场景1搜索引擎索引搜索引擎通过爬虫程序持续收集互联网上的网页内容,建立索引并提供搜索服务以百度和Google为例,它们的网页收录量已超过千亿条,每天还有数以亿计的新增内容需要处理搜索引擎爬虫不仅收集文本内容,还会处理图片、视频等多媒体资源,是最大规模的爬虫应用2市场行情监测企业通过爬虫自动收集电商平台商品价格、房产网站房源信息、招聘网站职位数据等市场行情,用于竞争分析和市场决策例如,电商企业会通过爬虫监控竞争对手的价格变化,实时调整自身定价策略;房地产分析师利用爬虫收集各区域房价走势,预测市场变化3舆情分析与学术研究通过爬取社交媒体、新闻网站、论坛等平台的内容,分析公众对特定事件、品牌或产品的情感倾向和意见分布学术研究者利用爬虫收集大量原始数据进行科学研究,如语言学研究者抓取网络文本分析语言变化,社会学家收集社交网络数据研究群体行为4竞品情报与风险控制企业通过爬虫收集竞争对手的产品信息、价格策略、营销活动等情报,为战略决策提供依据爬虫生态与发展现状Python主导的爬虫生态爬虫技术发展趋势在中国的爬虫开发项目中,Python占据了约70%的市场份额,成为绝对主流的爬虫开发语言Python凭借其简洁的语法、丰富的第三方库和强大的社区支持,成为爬虫开发的首选语言主流Python爬虫库的活跃度和下载量持续增长•Requests库月下载量超过5000万次•BeautifulSoup在GitHub上有超过10000颗星•Scrapy框架拥有40000+星标,成为最受欢迎的爬虫框架•Selenium在爬虫和自动化测试领域双向发力随着反爬技术的不断升级,爬虫技术也在持续演化•基于机器学习的智能爬虫系统正在兴起•分布式爬虫架构成为大规模数据采集的标准•云服务提供商开始提供专业的爬虫云服务•各大企业纷纷建立自有爬虫平台和定制化解决方案通用爬虫技术基础1HTTP协议基础HTTP(超文本传输协议)是爬虫技术的基石,它定义了客户端与服务器之间的通信规则请求方法GET(获取资源)、POST(提交数据)、HEAD(获取头信息)等请求头包含User-Agent、Referer、Cookie等关键信息状态码200(成功)、404(未找到)、403(禁止访问)、500(服务器错误)等响应头包含Content-Type、Content-Length、Set-Cookie等信息2浏览器与服务端通信原理了解浏览器如何与服务器进行通信,是编写有效爬虫的关键DNS解析将域名转换为IP地址TCP连接建立客户端与服务器的连接发送HTTP请求浏览器向服务器发送请求服务器处理服务器解析请求并生成响应接收响应浏览器接收并处理服务器返回的数据渲染页面浏览器解析HTML、CSS和JavaScript,渲染页面3网页数据的组织与传输现代网页数据的组织形式多样,爬虫需要处理各种数据格式HTML网页的基本结构,包含文本、链接、表格等CSS定义网页的样式和布局JavaScript提供交互功能和动态内容JSON轻量级数据交换格式,常用于API响应XML可扩展标记语言,用于存储和传输数据网页结构基础HTML/DOM树结构HTML(超文本标记语言)是构建网页的标准语言,通过标签定义网页元素和结构浏览器将HTML解析为DOM(文档对象模型)树,代表网页的结构化表示DOM树由节点组成,包括文档节点整个HTML文档的根节点元素节点HTML标签如div、p、a等属性节点元素的属性,如id、class、href等文本节点元素内的文本内容注释节点HTML中的注释内容网页元素定位技术了解DOM树结构是准确定位和提取网页数据的基础XPath是XML路径语言,用于在XML文档中导航和选择节点//div[@class=product]//h2#选择class为product的div下的所有h2元素//a[@href]#选择所有有href属性的a元素//table//tr[position1]#选择表格中除第一行外的所有行CSS选择器使用类似CSS的语法定位元素div.product h2#选择class为product的div下的所有h2元素a[href]#选择所有有href属性的a元素table tr:not:first-child#选择表格中除第一行外的所有行爬虫的数据抓取流程发送请求解析响应数据清洗和存储爬虫通过模拟浏览器行为发送HTTP请求到目标网站服服务器返回响应后,爬虫需要解析各种格式的数据抓取的原始数据通常需要进一步处理才能使用务器这一阶段需要关注•HTML解析使用BeautifulSoup、lxml等库解析•数据清洗去除无用内容、修复缺失值、格式统•请求头设置模拟真实用户的User-Agent、HTML结构一化Referer等•JSON解析处理API返回的JSON数据•数据转换将非结构化数据转为结构化数据•Cookie管理处理需要登录或身份验证的网站•XML解析解析结构化的XML响应•数据验证确保数据的完整性和准确性•请求参数URL参数、表单数据等•二进制数据处理下载图片、文件等•数据存储保存到文件(CSV、JSON、Excel)或•请求方法选择GET、POST等数据库(MySQL、MongoDB)•编码处理处理不同字符编码的响应•代理IP使用防止IP被封禁•数据更新定期更新和维护数据集•动态内容渲染处理JavaScript生成的内容•请求频率控制避免对服务器造成过大压力处理动态页面静态页面与动态页面的区别现代网站越来越多地使用JavaScript动态生成内容,这给传统爬虫带来了挑战静态页面服务器直接返回完整HTML,源代码中包含所有内容动态页面初始HTML只是框架,真实内容通过JavaScript异步加载检测页面是否动态的方法•查看网页源代码与浏览器开发者工具中的DOM是否一致•搜索关键内容是否出现在源代码中•检查是否有大量AJAX请求或React/Vue等前端框架处理动态内容的技术浏览器自动化方案•Selenium控制真实浏览器执行JavaScript渲染•Puppeteer基于Headless Chrome的自动化工具•Playwright支持多浏览器的自动化框架Robots.txt与爬虫礼仪理解Robots协议爬虫礼仪与最佳实践Robots.txt是网站根目录下的一个文本文件,用于告诉爬虫哪些页面可以访问,哪些不能访问它是网络爬虫应该遵守除了遵守Robots.txt,一个有礼貌的爬虫还应该的基本礼仪规范使用合理的User-Agent设置合适的User-Agent标识,不要刻意隐藏爬虫身份如果是商业用途,最好使用包含联系方式的标识控制请求频率避免短时间内发送大量请求,合理设置爬取间隔,遵守网站的Crawl-delay指令,防止给服务器带来过大负载避开高峰时段选择网站流量较低的时段进行爬取,如夜间或周末,减少对网站正常服务的影响遵守数据使用规定查看网站的服务条款和隐私政策,确保你的数据使用方式不违反网站规定,尤其是商业用途时Robots.txt示例User-agent:*#适用于所有爬虫Disallow:/admin/#禁止访问admin目录Disallow:/private/#禁止访问private目录Allow:/public/#允许访问public目录Crawl-delay:10#每次请求间隔10秒尊重Robots.txt是负责任爬虫的基本原则,但它并非强制性的技术限制,而是一种道德约定爬虫开发常用库介绍Requests库BeautifulSoup库Lxml/Html5libPython最流行的HTTP客户端库,简单强大的HTML/XML解析工具,用于从网不同的HTML解析器,各有特点Lxml易用,用于发起HTTP请求获取网页内容页中提取数据基于C语言,速度快但对格式要求高;Html5lib基于浏览器渲染引擎,容错性安装pip installbeautifulsoup4强但速度较慢安装pip installrequests特点简单易学、容错能力强、支持多安装pip installlxml html5lib特点简洁的API、自动处理cookies、种解析器、提供导航和搜索DOM树的方支持各种认证方式、处理重定向和超时法Selenium Scrapy浏览器自动化工具,可控制真实浏览器全功能的爬虫开发框架,提供了爬取、执行各种操作,适合处理JavaScript渲染处理、存储的完整流程支持的动态页面安装pip installscrapy安装pip installselenium特点可模拟真实用户行为、支持多种浏览器、能处理复杂交互场景Requests库核心用法基本请求方法Cookie与会话管理import requests#GET请求response=requests.gethttps://www.example.comprintresponse.text#打印响应内容#使用Session保持Cookiesession=requests.Sessionsession.gethttps://www.example.com/login#获取初始Cookieresponse=printresponse.status_code#打印状态码#带参数的GET请求params={key1:value1,key2:value2}response=session.post https://www.example.com/login,data={username:user,password:pass}#登录后的请求会自动带上requests.gethttps://www.example.com/search,params=paramsprintresponse.url#打印完整URL#POST请求data={username:Cookieprofile=session.gethttps://www.example.com/profileuser,password:pass}response=requests.posthttps://www.example.com/login,data=dataprintresponse.json#解析JSON响应超时与重试机制#设置超时try:response=requests.gethttps://www.example.com,timeout=5except requests.Timeout:print请求超时#带重试的请求from requests.adapters importHTTPAdapterfrom urllib
3.util.retry importRetryretry_strategy=Retry total=3,#最多重试3次backoff_factor=1,#重试间隔status_forcelist=[500,502,503,504]#这些状态码时重试adapter=HTTPAdaptermax_retries=retry_strategysession=requests.Sessionsession.mounthttps://,adaptersession.mounthttp://,adapterresponse=session.gethttps://www.example.com自定义请求头headers={User-Agent:Mozilla/
5.0Windows NT
10.0;Win64;x64AppleWebKit/
537.36,Referer:https://www.example.com,Accept-Language:zh-CN,zh;q=
0.9}response=requests.gethttps://www.example.com,headers=headers代理设置BeautifulSoup核心用法创建BeautifulSoup对象查找元素方法from bs4import BeautifulSoup#从HTML字符串创建html=html bodyh1class=titleHello World/h1pclass=contentThis isa paragraph./p ulid=list liItem1/li liItem2/li/ul/body/html#选择解析器:html.parserPython内置,lxml速度快,html5lib最准确soup=BeautifulSouphtml,lxml#从文件创建with openpage.html,r as f:soup=BeautifulSoupf,html.parser#与requests结合使用import requestsresponse=requests.gethttps://www.example.comsoup=BeautifulSoupresponse.text,lxml正则表达式提取数据正则表达式基础常用正则表达式模式正则表达式是一种强大的文本模式匹配工具,特别适合从非结构化文本中提取特定格式的数据数据类型正则表达式import re#基本匹配text=我的电话是123-4567-8901pattern=r\d{3}-\d{4}-\d{4}result=re.searchpattern,textif result:电子邮箱r[a-zA-Z0-
9._%+-]+@[a-zA-Z0-
9.-]+\.[a-zA-Z]{2,}printresult.group#输出:123-4567-8901#匹配多个结果text=联系方式123-4567-8901或987-6543-2109pattern=r\d{3}-\d{4}-\d{4}results=re.findallpattern,textprintresults#输出:[123-4567-8901,987-6543-2109]#使用分组提取text=中国手机号r1[3-9]\d{9}姓名:张三,邮箱:zhangsan@example.compattern=r姓名:.*,邮箱:.*$result=re.searchpattern,textif result:name,email=result.groups printf姓名:{name},邮箱:{email}URL rhttps://:[-\w.]|:%[\da-fA-F]{2}+IP地址r\b:\d{1,3}\.{3}\d{1,3}\b中国身份证号r\d{17}[\dXx]正则表达式与BeautifulSoup结合Selenium自动化爬虫Selenium环境配置元素定位与操作Selenium需要与浏览器驱动配合使用,常用的有#定位元素#By.ID,By.NAME,By.CLASS_NAME,By.TAG_NAME,By.LINK_TEXT,#By.PARTIAL_LINK_TEXT,By.XPATH,By.CSS_SELECTOR#输入文•ChromeDriver配合Google Chrome浏览器本search_box=driver.find_elementBy.NAME,qsearch_box.send_keysSelenium Python#点击按钮submit_button=•geckodriver配合Firefox浏览器driver.find_elementBy.CSS_SELECTOR,input[type=submit]submit_button.click#获取文本results=driver.find_elementsBy.CSS_SELECTOR,.resultfor resultin results:printresult.text•Microsoft EdgeDriver配合Edge浏览器#安装Seleniumpip installselenium#下载对应浏览器版本的驱动#Chrome:https://chromedriver.chromium.org/downloads#Firefox:https://github.com/mozilla/geckodriver/releases基本使用方法from seleniumimport webdriverfromselenium.webdriver.chrome.service importServicefrom selenium.webdriver.common.by importByimporttime#设置ChromeDriver路径service=Service/path/to/chromedriverdriver=webdriver.Chromeservice=service#访问网页driver.gethttps://www.example.com#等待页面加载(建议使用显式等待,这里用简单的sleep示例)time.sleep2#获取页面标题处理动态内容和交互printdriver.title#关闭浏览器driver.quitScrapy框架详解Scrapy架构组件项目结构与创建Scrapy是一个功能完整的爬虫框架,采用组件化设计,各部分协同工作#安装Scrapypip installscrapy#创建新项目scrapy startprojectexample_project#项目结构example_project/├──scrapy.cfgEngine核心引擎,负责组件间数据流和信号的传递#部署配置文件└──example_project/#Python模块目录├──__init__.py├──items.py#数据定义Spider用户编写的爬虫类,定义如何抓取和解析页面├──middlewares.py#中间件├──pipelines.py#数据处理├──settings.py#项目设置└──spiders/Scheduler调度器,接收请求并安排执行顺序#爬虫目录└──__init__.py#创建爬虫cd example_projectscrapy genspiderexample example.comDownloader下载器,负责获取网页内容并返回响应Item Pipeline项目管道,负责处理爬取到的数据Middleware中间件,处理请求和响应,实现功能扩展Spider示例代码Item与Pipeline#spiders/example.pyimport scrapyfromexample_project.items importProductItemclass ExampleSpiderscrapy.Spider:name=example#爬虫名称allowed_domains=[example.com]#允许爬取的域名start_urls=[https://example.com/products]#起始URL defparseself,response:#提取商品列表for productin response.cssdiv.product:item=ProductItem item[name]=product.cssh2::text.get item[price]=product.cssspan.price::text.get item[url]=product.cssa::attrhref.get yielditem#处理分页next_page=response.cssa.next::attrhref.get ifnext_page:yieldresponse.follownext_page,self.parse多线程与异步爬虫并发爬虫的必要性异步爬虫实现当需要爬取大量页面时,单线程爬虫效率低下使用并发技术可以显著提高爬取速度import aiohttpimportasynciofrom bs4import BeautifulSoupasyncdef fetchsession,url:try:async with•利用CPU多核性能,同时处理多个任务session.geturl asresponse:return awaitresponse.text except Exception as e:printf爬取{url}失败:•在I/O等待期间执行其他任务,避免空闲{e}return Noneasyncdef parsehtml:if html:soup=BeautifulSouphtml,html.parser#处理数据...return数据处理结果return Noneasyncdef crawlurl:async withaiohttp.ClientSession assession:html=await•可以模拟多用户同时访问,更自然fetchsession,url result=await parsehtmlprintf处理{url}完成return resultasyncdef main:但并发爬虫也面临挑战urls=[fhttps://example.com/page/{i}for iin range1,11]#创建任务tasks=[]for urlin urls:#控制并发,避免同时发送太多请求await asyncio.sleep
0.5tasks.appendasyncio.create_taskcrawlurl#等待所有任务完成•需要控制并发数量,避免对服务器压力过大results=await asyncio.gather*tasks returnresults#运行异步主函数if__name__==__main__:results=•处理复杂的线程同步和资源竞争问题asyncio.runmain printf共爬取{lenresults}个页面•容易触发网站的反爬机制多线程爬虫实现import requestsfrombs4import BeautifulSoupimportthreadingimport queueimporttime#初始化URL队列url_queue=queue.Queuefori in range1,11:url_queue.putfhttps://example.com/page/{i}#定义爬虫线程def crawler_thread:while noturl_queue.empty:url=url_queue.get try:response=requests.geturl soup=BeautifulSoupresponse.text,html.parser#处理数据...printf爬取{url}成功exceptException as e:printf爬取{url}失败:{e}finally:#完成任务url_queue.task_done#添加延迟,避免请求过快time.sleep1#创建并启动多个线程thread_num=5threads=[]for iin rangethread_num:t=threading.Threadtarget=crawler_thread t.daemon=True threads.appendt t.start#等待所有任务完成url_queue.joinGIL与并发性能数据清洗与持久化数据清洗流程1爬取的原始数据通常需要进行一系列处理才能使用数据去重删除重复记录,避免数据冗余2文件存储方式缺失值处理补全或移除缺失数据数据转换将文本转换为适当的数据类型(数字、日期等)处理后的数据可以保存为多种格式数据规范化统一格式,如电话号码、地址等#保存为CSVdf.to_csvproducts.csv,index=False,encoding=utf-8-sig#保存为Exceldf.to_excelproducts.xlsx,数据验证检查数据的有效性和准确性index=False#保存为JSONimport jsonwithopenproducts.json,w,encoding=utf-8as f:json.dumpdata,f,数据过滤移除不相关或不需要的信息ensure_ascii=False,indent=2#保存为XMLimport dicttoxmlfromxml.dom.minidom importparseStringxml=dicttoxml.dicttoxmldatadom=parseStringxmlpretty_xml=dom.toprettyxmlwith openproducts.xml,w,#简单数据清洗示例import pandasas pd#假设data是从网页抓取的数据列表data=[{name:产品A,price:¥
199.00,encoding=utf-8asf:f.writepretty_xmlstock:有货},{name:产品B,price:缺货,stock:无货},{name:产品A,price:¥199,stock:有货}]#转换为DataFramedf=pd.DataFramedata#去重df=df.drop_duplicatessubset=[name]#处理价格-提取数字df[price]=df[price].str.extractr\d+#转换库存状态为布尔值df[in_stock]=df[stock].applylambda x:x==有货printdf数据库存储3对于大量数据或需要频繁查询的场景,数据库是更好的选择常见反爬机制识别验证码类型与破解IP封禁与限频JavaScript混淆请求头检测验证码是网站最常用的反爬机制之一网站通过监控请求频率和模式识别爬虫网站使用JavaScript混淆技术保护数据网站通过检查HTTP请求头识别爬虫图形验证码包含扭曲文字或数字的图片•频率限制短时间内限制请求次数•动态渲染数据通过JS动态加载User-Agent检测识别非浏览器UA•IP封禁直接封禁可疑IP地址•代码混淆使代码难以理解和分析Referer检查验证请求来源滑块验证码需要拖动滑块到指定位置•访问模式检测识别非人类的访问模式•数据加密对关键数据进行加密Cookie验证要求有效的会话Cookie点选验证码要求点击特定物体或按顺序点应对方法应对方法Headers一致性检查请求头组合是否合理击•降低爬取频率,模拟人类浏览节奏•使用浏览器自动化工具Selenium执行行为验证码分析用户行为判断是否为机器JS应对方法•使用代理IP池,定期切换IP人•分析网络请求找到数据API•使用真实浏览器的User-Agent•随机化请求间隔,避免规律性应对方法•逆向分析JS代码理解加密算法•维护完整的请求头信息•分布式爬虫,分散请求压力•简单图形验证码可使用OCR技术识别•使用专业工具如PyExecJS执行关键JS•保持Cookie会话一致性•复杂验证码可使用人工识别服务代码•使用机器学习模型训练识别爬虫代理和限速代理IP使用策略随机UA池构建代理IP是绕过网站IP封禁的有效手段根据不同需求可以选择不同类型的代理class UserAgentPool:def__init__self:self.user_agents=[Mozilla/
5.0Windows NT
10.0;Win64;x64AppleWebKit/
537.36KHTML,like GeckoChrome/
91.
0.
4472.124Safari/
537.36,Mozilla/
5.0X11;Linux x86_64透明代理AppleWebKit/
537.36KHTML,like GeckoChrome/
92.
0.
4515.107Safari/
537.36,Mozilla/
5.0Windows NT
10.0;Win64;x64;rv:
90.0Gecko/20100101Firefox/
90.0,Mozilla/
5.0Macintosh;Intel MacOS X10_15_7AppleWebKit/
605.
1.15目标网站能够检测到你在使用代理,并能够知道你的真实IP地址这类代理主要用于匿名浏览,不适合爬虫使用KHTML,like GeckoVersion/
14.
1.1Safari/
605.
1.15,Mozilla/
5.0Windows NT
10.0;Win64;x64AppleWebKit/
537.36KHTML,like GeckoChrome/
91.
0.
4472.124Safari/
537.36Edg/
91.
0.
864.59]def get_random_uaself:return random.choiceself.user_agents匿名代理目标网站能够检测到你在使用代理,但无法获知你的真实IP地址提供基本的匿名性,但一些网站会直接拒绝代理IP访问高匿代理目标网站无法检测你在使用代理,这类代理最适合爬虫使用可以有效规避IP封禁,但价格较高且稳定性需要评估限速与请求控制住宅IP代理使用真实用户的住宅宽带IP作为代理,几乎不会被网站识别为代理IP这是最高级的代理类型,价格也最昂贵class RateLimiter:def__init__self,max_requests=10,time_period=60:#最大请求数/时间周期秒self.max_requests=max_requests self.time_period=time_period self.request_timestamps=[]def代理池构建wait_if_neededself:如果请求过快,等待一段时间current_time=time.time#移除过期的时间戳self.request_timestamps=[ts forts inself.request_timestamps ifcurrent_time-ts self.time_period]#如果已达到限制,等待if lenself.request_timestamps=self.max_requests:import requestsimportrandomimport timefromconcurrent.futures importThreadPoolExecutorclass ProxyPool:defoldest_timestamp=minself.request_timestamps sleep_time=self.time_period-current_time-oldest_timestamp__init__self:self.proxies=[]self.valid_proxies=[]def add_proxiesself,proxy_list:if sleep_time0:printf限速,等待{sleep_time:.2f}秒time.sleepsleep_timeself.proxies.extendproxy_list defvalidate_proxyself,proxy:try:response=#添加当前请求的时间戳self.request_timestamps.appendtime.time defrandom_delayself,min_delay=1,requests.get https://www.baidu.com,proxies={http:proxy,https:proxy},max_delay=5:随机延迟,模拟人类行为delay=random.uniformmin_delay,max_delay time.sleepdelaytimeout=5if response.status_code==200:printf代理{proxy}有效return proxyexcept:pass return None defbuild_valid_poolself:withThreadPoolExecutormax_workers=10as executor:results=listexecutor.mapself.validate_proxy,self.proxiesself.valid_proxies=[p forp inresults ifp]printf有效代理数量:{lenself.valid_proxies}defget_random_proxyself:if notself.valid_proxies:returnNonereturnrandom.choiceself.valid_proxies抓包与接口识别抓包工具的应用浏览器开发者工具分析抓包工具是发现网站数据接口的利器,常用工具包括浏览器自带的开发者工具也是非常强大的分析工具Fiddler Windows平台流行的抓包工具
1.打开浏览器开发者工具(F12或右键-检查)Charles跨平台图形界面抓包工具
2.切换到Network面板Wireshark功能强大的网络分析工具
3.访问目标页面并观察网络请求mitmproxy命令行抓包工具,支持Python扩展
4.寻找包含所需数据的XHR/Fetch请求
5.分析请求参数和响应数据格式使用抓包工具的主要步骤分析技巧
1.安装并配置抓包工具(如安装证书)
2.设置代理,让浏览器流量通过抓包工具•使用Filter过滤器只显示XHR/Fetch请求
3.访问目标网站,执行相关操作•通过请求名称或响应内容搜索相关数据
4.分析捕获的请求和响应•分析请求头和参数,了解认证方式
5.筛选出包含目标数据的请求•检查cookies和localStorage,发现关键信息接口还原与模拟综合案例1电商商品价格监控项目目标多页面遍历与存储开发一个爬虫系统,定期监控电商平台(如京东、淘宝)上特定商品的价格变化和评论,帮助用户获取价格走势和消费者反馈def save_product_infoproduct_info:conn=sqlite
3.connectjd_products.db cursor=conn.cursor#创建表(如技术栈选择果不存在)cursor.execute CREATETABLE IFNOT EXISTSproductsid INTEGER,title TEXT,priceREAL,comment_count TEXT,date TEXT,PRIMARY KEYid,date#插入数据Selenium处理JavaScript渲染的动态页面cursor.execute INSERTINTO productsid,title,price,comment_count,date VALUES,,,,,BeautifulSoup解析HTML提取数据product_info[id],product_info[title],product_info[price],product_info[comment_count],product_info[date]conn.commit conn.close#批量处理多个商品def monitor_productsproduct_ids:forSQLite存储历史价格数据product_id inproduct_ids:try:product_info=get_jd_product_infoproduct_idMatplotlib生成价格走势图save_product_infoproduct_info printf商品{product_id}信息保存成功except Exception ase:APScheduler定时执行爬虫任务printf处理商品{product_id}时出错:{e}#间隔一段时间再请求下一个商品time.sleep10#设置定时任务from核心代码商品页面爬取apscheduler.schedulers.blocking importBlockingSchedulerscheduler=BlockingSchedulerproduct_ids=[100012345678,100023456789,100034567890]#每天早上10点和晚上8点执行scheduler.add_job lambda:monitor_productsproduct_ids,cron,hour=10,20,id=monitor_jobprint价格监控任务已启动...scheduler.startfrom seleniumimport webdriverfromselenium.webdriver.chrome.service importServicefrom selenium.webdriver.common.by importByfrombs4import BeautifulSoupimporttimeimport sqlite3import datetimedef get_jd_product_infoproduct_id:service=Servicepath/to/chromedriver driver=webdriver.Chromeservice=service url=fhttps://item.jd.com/{product_id}.html try:driver.geturl time.sleep2#等待页面加载#获取商品标题title=driver.find_elementBy.CLASS_NAME,sku-name.text.strip#获取商品价格price_element=driver.find_elementBy.CLASS_NAME,price price=price_element.text.replace¥,.strip#获取评论数量driver.getfhttps://item.jd.com/{product_id}.html#comment time.sleep2#等待评论加载comment_count=driver.find_element By.CLASS_NAME,count.text.strip return{id:product_id,title:title,price:floatprice,comment_count:comment_count,date:datetime.datetime.now.strftime%Y-%m-%d%H:%M:%S}finally:driver.quit综合案例2招聘信息爬取数据存储与更新defget_job_detailsself,job_info:获取职位详情页headers={User-Agent:self.ua.random,Referer:self.base_url}try:response=requests.get job_info[url],headers=headers,timeout=10soup=BeautifulSoupresponse.text,html.parser#提取职位描述description=soup.select_one.job-detail ifdescription:job_info[description]=description.text.strip#提取公司信息company_info=soup.select_one.company-info__3Z4CY ifcompany_info:job_info[company_size]=company_info.select_oneli:nth-child
3.text.stripjob_info[company_status]=company_info.select_oneli:nth-child
2.text.stripreturn job_info exceptException ase:printf获取职位详情出错:{e}return job_info defsave_to_csvself,filename=lagou_jobs.csv:保存数据到CSV文件if notself.jobs:print没有职位数据可保存returndf=pd.DataFrameself.jobs df.to_csvfilename,index=False,encoding=utf-8-sigprintf已保存{lenself.jobs}条职位信息到{filename}def runself,keyword,city,max_pages=5:运行爬虫printf开始爬取{city}地区的{keyword}职位...for pageinrange1,max_pages+1:printf正在爬取第{page}页...if notself.get_job_listkeyword,city,page:printf没有更多数据,爬取结束于第{page}页break#随机延迟time.sleeprandom.uniform3,5print开始获取职位详情...for i,job inenumerateself.jobs:printf正在获取第{i+1}/{lenself.jobs}个职位详情self.jobs[i]=self.get_job_detailsjobtime.sleeprandom.uniform2,4self.save_to_csv print爬取完成!#使用示例if__name__==__main__:spider=LagouJobSpider spider.runkeyword=Python开发,city=北京,max_pages=3综合案例3学术文献批量采集项目背景验证码处理与文件下载为学术研究者开发一个批量下载学术文献的爬虫工具,支持从CNKI、万方、谷歌学术等平台搜索并下载相关论文def is_captcha_presentself:检查是否存在验证码try:captcha_img=这类爬虫需要解决的主要挑战self.driver.find_elementBy.ID,checkcode returncaptcha_img.is_displayed except:returnFalse defsolve_captchaself:处理验证码try:#截取验证码图片•学术网站反爬措施普遍严格captcha_img=self.driver.find_elementBy.ID,checkcode captcha_img.screenshotcaptcha.png•大多需要登录或验证码识别#使用OCR识别验证码ocr=ddddocr.DdddOcr withopencaptcha.png,rb asf:img_bytes•下载限制与IP封禁频繁=f.read captcha_text=ocr.classificationimg_bytes#输入验证码•文件格式多样,需处理PDF、CAJ等self.driver.find_elementBy.ID,TextBoxVerifyCode.send_keyscaptcha_text printf验证码识别结果:{captcha_text}#删除临时文件os.removecaptcha.png returnTrue exceptException ase:printf验证CNKI爬虫实现码处理失败:{e}return Falsedef search_papersself,keyword,start_date=None,end_date=None,max_papers=10:搜索论文#进入高级搜索页面self.driver.gethttps://kns.cnki.net/kns8/AdvSearchfrom seleniumimport webdriverfromselenium.webdriver.chrome.service importServicefrom selenium.webdriver.common.by import#选择专业检索self.wait.until EC.element_to_be_clickableBy.XPATH,//ul[@class=search-Byfrom selenium.webdriver.support.ui importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions astab]/li
[3].click#输入检索式search_input=ECimport timeimportosimport randomimportddddocr#验证码识别库class CNKISpider:def__init__self,username,password:self.wait.until EC.presence_of_element_locatedBy.ID,expertvaluesearch_input.clearself.username=username self.password=password service=Service/path/to/chromedriver options=#构建检索式search_expr=fSU={keyword}if start_date andend_date:search_expr+=f ANDwebdriver.ChromeOptions#设置下载路径prefs={download.default_directory:YE={start_date}AND YE={end_date}search_input.send_keyssearch_expr#点击检索按钮os.path.joinos.getcwd,papers,download.prompt_for_download:False}self.driver.find_elementBy.XPATH,//input[@class=btn-search].click#等待结果加载time.sleep5options.add_experimental_optionprefs,prefs self.driver=webdriver.Chromeservice=service,options=options#检查结果数量try:result_count=self.driver.find_element By.XPATH,self.wait=WebDriverWaitself.driver,20#创建下载目录os.makedirspapers,exist_ok=True def//div[@class=pagerTitleCell]/span.text printf搜索结果:{result_count}except:loginself:登录CNKI self.driver.gethttps://kns.cnki.net/kns8/AdvSearch#点击登录按钮print未找到匹配结果return[]#收集论文信息papers=[]page=1whilelogin_btn=self.wait.until EC.element_to_be_clickableBy.XPATH,//a[containstext,登录]lenpapersmax_papers:#获取当前页面的论文paper_items=login_btn.click#切换到登录框架self.driver.find_elements By.XPATH,//tr[@class=odd or@class=even]self.wait.untilEC.frame_to_be_available_and_switch_to_it By.XPATH,//iframe[@id=loginIframe]f oritem inpaper_items:if lenpapers=max_papers:break#输入用户名密码self.wait.until EC.element_to_be_clickableBy.ID,try:title=item.find_elementBy.XPATH,.//a[@class=fz14].text authors=TextBoxUserName.send_keysself.username self.driver.find_elementBy.ID,item.find_elementBy.XPATH,.//td
[3].text source=item.find_elementBy.XPATH,.//td
[4].textTextBoxPassword.send_keysself.password#处理验证码if self.is_captcha_present:date=item.find_elementBy.XPATH,.//td
[5].text paper_info=self.solve_captcha#点击登录self.driver.find_elementBy.ID,Button
1.click#等待登{title:title,authors:authors,source:source,录成功time.sleep3#切回主框架self.driver.switch_to.default_content print登录成功!date:date}papers.appendpaper_info printf收集论文:{title}exceptExceptionase:printf处理论文条目时出错:{e}#检查是否有下一页try:next_btn=self.driver.find_element By.XPATH,//a[@id=PageNext]if disabledin next_btn.get_attributeclass:break page+=1printf翻到第{page}页next_btn.click time.sleeprandom.uniform3,5except:break returnpapers爬虫项目规范与团队协作项目目录组织标准化的目录结构使项目更易维护,建议的爬虫项目结构my_spider_project/├──scrapers/#爬虫模块目录│├──__init__.py│├──base_spider.py#基础爬虫类│├──site_a_spider.py#特定网站爬虫│└──site_b_spider.py├──models/#数据模型│├──__init__.py│└──item.py├──utils/#工具函数│├──__init__.py│├──parser.py│├──proxy.py│└──logger.py├──storage/#数据存储│├──__init__.py│├──database.py│└──file_storage.py├──configs/#配置文件│├──settings.py│└──urls.py├──tests/#单元测试│├──__init__.py│└──test_spider.py├──data/#数据目录├──logs/#日志目录├──requirements.txt#依赖列表├──main.py#主入口└──README.md#文档模块复用设计设计可复用的组件,减少代码重复#base_spider.py-基础爬虫类class BaseSpider:def__init__self,name,config:self.name=name self.config=configself.logger=self._init_loggerself.session=self._init_sessiondef_init_loggerself:#创建日志记录器return Loggerself.name def_init_sessionself:#创建请求会话return RequestsSessionself.configdef parseself,response:#子类必须实现的解析方法raise NotImplementedErrordefsaveself,items:#保存数据的通用方法storage=get_storageself.configreturn storage.saveitems defrunself:#爬虫运行的主流程self.logger.infofStarting{self.name}spider try:urls=self.get_start_urls forurl inurls:response=self.session.geturl items=self.parseresponseself.saveitems exceptExceptionase:self.logger.errorfError in{self.name}:{e}finally:self.logger.infofFinished{self.name}spider数据合规与法律风险中国数据安全法规概述爬虫合规指南近年来,中国对数据安全和网络合规的法律法规愈发严格,爬虫开发者需要了解这些法规以避免法律风险《网络安全法》12017年生效,是中国网络安全的基础性法律,规定了网络运营者的安全保护义务和个人信息保护要求爬虫相关条款第二十二条规定不得从事非法侵入他人网络、干扰他人网络正常功能等活动《数据安全法》22021年9月生效,对数据处理活动、数据安全和监督管理作出了规定爬虫相关条款第四十条规定,通过数据处理活动获取数据,应当遵循合法正当方式,不得窃取或者以其他非法方式获取数据《个人信息保护法》32021年11月生效,是中国个人信息保护的专门法律爬虫相关条款明确规定处理个人信息应当取得个人同意,且不得过度收集个人信息爬虫抓取含有个人信息的数据时需特别注意《反不正当竞争法》42019年修订版规定了经营者不得实施的不正当竞争行为爬虫相关条款第十二条规定,经营者不得利用技术手段,妨碍、破坏其他经营者合法提供的网络产品或者服务的正常运行大规模爬取可能被视为此类行为为降低法律风险,爬虫开发和使用应遵循以下原则明确数据用途只收集必要的数据,并有明确的使用目的尊重robots.txt遵守网站通过robots.txt设置的访问规则控制访问频率避免对目标网站造成过大负载不破解限制措施不突破网站设置的技术防护措施避免抓取个人敏感信息如身份证号、电话号码等合理使用数据不将抓取的数据用于非法或不道德目的商业用途需谨慎商业利用他人数据可能涉及侵权保留数据来源标明数据的来源,尊重原始信息提供者企业爬虫合规措施企业开展爬虫业务的额外措施•建立数据合规审核制度,评估每个爬虫项目的合规风险最新爬虫发展趋势反爬机制智能化数据接口API化网站反爬技术正在向更智能的方向发展越来越多的网站提供规范的API接口,替代传统的网页抓取•基于机器学习的行为分析,精确识别爬虫行为•各大平台开放数据接口,如微博、知乎、豆瓣等•AI验证码(如reCAPTCHA v3)不再依赖明显的图形挑战•第三方数据服务兴起,如聚合数据、阿里云市场•TLS指纹识别,通过浏览器通信特征检测爬虫•GraphQL等新型API技术提供更灵活的数据获取方式•基于设备特征的人机验证,分析硬件和系统特征•API管理平台普及,便于开发者集成和使用•更复杂的JavaScript混淆和蜜罐技术这一趋势使得数据获取更加规范化,减少了直接爬取的需求,但也带来了新的这些技术使简单爬虫越来越难以绕过防护,爬虫也需要向更智能的方向发展技术挑战云端爬虫平台Web技术演进爬虫技术正在向云端和平台化方向发展Web技术的发展也在影响爬虫的技术路线•阿里云、华为云等推出专业的爬虫云服务•WebAssembly使网页性能提升,也增加了解析难度•无代码/低代码爬虫平台降低使用门槛•前端框架(React、Vue等)主导的SPA应用普及•分布式爬虫架构成为大规模数据采集的标准•服务端渲染SSR和静态站点生成SSG技术兴起•容器化和微服务架构使爬虫部署更加灵活•WebSocket和Server-Sent Events等实时通信技术广泛应用•Serverless爬虫减少基础设施维护成本•HTTP/3和QUIC协议逐渐普及云端爬虫平台使爬虫开发和维护成本大幅降低,同时提高了数据处理能力爬虫技术需要不断适应Web技术的变化,以保持对各类网站的兼容性法规与合规要求提高AI驱动的智能爬虫全球范围内数据合规要求不断提高人工智能技术正在深刻改变爬虫的开发和应用•各国数据保护法规收紧,如欧盟GDPR、中国《个人信息保护法》•自适应爬虫能根据网站结构变化自动调整抓取策略•行业特定的数据合规要求增多•基于NLP的内容理解和提取,超越简单的模式匹配•法院判例逐渐形成爬虫相关法律边界•图像识别技术处理验证码和图片内容•企业对数据来源合规性审查更加严格•机器学习模型预测最佳爬取时间和频率•数据合规认证和审计成为新趋势•生成式AI辅助编写和优化爬虫代码这一趋势要求爬虫开发者更加重视合规性,遵循合法、正当、必要原则AI技术使爬虫更加智能和高效,能够处理更复杂的网页和数据结构推荐工具与学习资源官方文档与网站GitHub优质爬虫项目Python官方资源•Python官方文档https://docs.python.org/zh-cn/3/•Python包索引PyPI https://pypi.org/•PEP8编码规范https://peps.python.org/pep-0008/爬虫库官方文档•Requests https://requests.readthedocs.io/zh_CN/latest/•BeautifulSoup https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/•Scrapy https://docs.scrapy.org/zh/latest/•Selenium https://selenium-python.readthedocs.io/•aiohttp https://docs.aiohttp.org/en/stable/在线学习平台•慕课网爬虫课程专区•中国大学MOOC网络爬虫课程•极客时间Python爬虫实战•Coursera网络数据采集课程•DataCamp网络抓取教程优质中文技术博客•崔庆才的个人博客-Python爬虫教程系列国产优秀爬虫项目推荐(按星标排序)•刘悦的技术博客-爬虫与数据分析•静觅博客-Python爬虫实战案例WechatSogou微信公众号爬虫•CSDN爬虫专区-各类爬虫教程和问答DoubanSpider豆瓣电影/读书/音乐爬虫•知乎专栏Python爬虫与数据分析Weibo-Scraper新浪微博爬虫•InfoQ中文站爬虫相关文章ZhihuSpider知乎爬虫BiliBiliTool B站自动化工具ProxyPool代理IP池CnkiSpider中国知网爬虫EasyLogin模拟登录工具Anjuke-Spider安居客房源爬虫JD-Assistant京东自动化工具推荐微信公众号•Python爬虫与数据挖掘常见问题及应对策略网站访问问题爬虫运行中经常遇到的网站访问问题及解决方案无法访问网站检查网络连接、目标站点是否宕机,或IP是否被封禁HTTP状态码403可能是被识别为爬虫,尝试设置合理的User-Agent、Referer等请求头页面频繁刷新网站可能使用了JS重定向或Cookie校验,使用Selenium模拟真实浏览器请求超时增加超时时间,或者使用代理IP解决网络问题随机重定向检查是否存在反爬重定向,使用会话对象保持Cookie当遇到网站无法访问时,可以尝试使用在线代理网站验证目标网站是否正常,排除IP封禁的可能性数据抓取问题数据提取过程中的常见问题数据不完整检查页面是否有懒加载或AJAX加载内容,等待完全加载或找到数据接口数据格式异常处理特殊字符、HTML实体等,使用正则表达式或字符串函数清洗数据丢失爬取过程中断,实现断点续爬和数据去重机制编码问题指定正确的字符编码,处理中文或其他非ASCII字符数据结构变化网站可能更新页面结构,需要设计灵活的解析方案或定期维护建立完善的数据验证机制,确保抓取的数据符合预期格式和质量标准,对异常数据进行标记和处理反爬机制应对遇到强反爬网站的解决策略验证码问题使用OCR识别简单验证码,复杂验证码考虑人工识别APIIP限制使用代理IP池轮换,控制请求频率,模拟人类访问模式Cookie验证保持会话一致性,处理各种Cookie检验机制接口加密分析JavaScript代码,还原加密算法,或使用浏览器自动化绕过行为检测模拟真实用户行为,包括鼠标移动、滚动、随机停顿等针对不同的反爬机制,需要采用不同的技术手段有时候减慢爬取速度、分散爬取时间反而能获得更好的效果技术困难解决遇到技术难题的解决渠道官方文档大多数问题在库的官方文档中都有答案,优先查阅技术社区Stack Overflow、SegmentFault等提问或搜索已有解答GitHub Issues查看相关项目的问题列表,很多常见问题都有讨论技术博客搜索相关技术博客,了解他人的解决方案开源项目参考类似功能的开源项目代码,学习实现方法提问前做好准备工作,提供清晰的问题描述、环境信息和复现步骤,有助于快速获得有效解答练习建议与实践指南爬虫学习路径推荐实战项目掌握爬虫技术需要循序渐进,建议按照以下路径学习建议在三个月内完成以下3-5个实战小项目,由简到难循序渐进基础入门阶段1新闻聚合器从有robots.txt的简单站点入手爬取多个新闻网站的最新新闻,按类别整合,实现个性化新闻推送适合初学者,主要使用Requests和BeautifulSoup,处理静态页面•学习Python基础语法和HTTP协议知识2进阶实践阶段•掌握Requests和BeautifulSoup库的基本用法电影数据分析•尝试爬取静态网页,如新闻网站文章列表逐步尝试复杂页面•学习数据存储基础,保存为CSV、JSON等格式•学习Selenium,处理JavaScript渲染的动态页面爬取豆瓣、IMDB等电影网站的评分和评论,分析不同地区观众的口味差异需要处理登录、分页和反爬,使用数据可视化展示结果•熟悉正则表达式,用于简单文本提取•掌握XPath和CSS选择器高级用法•了解常见反爬机制和对应解决方案二手房价格监控高级开发阶段3•实现多线程爬虫,提高爬取效率爬取链家、安居客等房产网站的房源信息,分析不同区域的价格趋势需要使用Selenium处理动态加载内容,实现数据库存储和定时更新•学习数据清洗和简单数据分析技术尝试数据接口和复杂系统•学习Scrapy框架,构建完整爬虫项目求职信息分析•掌握抓包分析,发现和使用API接口•实现分布式爬虫,处理大规模数据爬取招聘网站的职位信息,分析不同城市、不同职位的薪资水平和技能需求需要处理复杂筛选条件和数据清洗,使用Scrapy框架实现•使用数据库存储和管理爬取数据•将爬虫与数据分析、可视化结合社交媒体监测学习爬虫技术的关键是持续实践,从简单项目开始,逐步挑战更复杂的目标理论学习与实战项目相结合,才能真正掌握这一技能爬取微博、知乎等平台关于特定话题的讨论,实现舆情监测和分析需要处理API接口、用户认证和内容过滤,结合NLP技术分析情感倾向课程总结与答疑核心知识点回顾学习成果与应用在本课程中,我们系统地学习了网络爬虫的基础知识和实战技能,主要包括以下几个方面1爬虫基础原理理解了HTTP协议、网页结构和浏览器工作原理,这是开发爬虫的理论基础掌握了如何分析网页结构,定位和提取所需数据的技术方法2核心技术工具掌握了Requests、BeautifulSoup、Selenium、Scrapy等主流爬虫库的使用方法,学会了处理静态页面和动态内容的不同技术路线3反爬应对策略了解了常见的反爬机制和相应的解决方案,学会了如何模拟真实用户行为,绕过网站的各种防护措施4数据处理能力通过本课程的学习,你应该能够学习了数据清洗、转换和存储的方法,掌握了如何将非结构化的网页数据转换为可分析的结构化数据•独立分析网站结构,设计爬虫方案•使用多种技术手段获取不同类型的网页数据5合规与伦理意识•处理常见的反爬机制,提高爬虫的稳定性•将爬取的数据应用于实际分析和决策建立了爬虫合规意识,了解了相关法律法规和行业规范,学会在合法合规的前提下开展爬虫工作•在合规的前提下开展爬虫项目后续学习方向爬虫技术是数据科学的重要基础,掌握爬虫后可以向以下方向拓展数据分析与可视化学习pandas、numpy、matplotlib等库,对爬取的数据进行深入分析机器学习与AI将爬取的数据用于训练机器学习模型,实现智能分析和预测自然语言处理结合NLP技术,分析爬取的文本数据,实现情感分析、文本分类等数据工程学习ETL、数据仓库等技术,构建完整的数据处理流水线网络安全深入了解Web安全和网络协议,提升爬虫的安全性和隐蔽性答疑与交流我们鼓励学员在学习过程中积极提问和交流,可以通过以下渠道获取支持•课程讨论区发布问题和经验分享•参加每周线上答疑直播•加入课程学习群,与同学互相交流•通过邮件联系课程讲师,获取一对一指导•参与定期组织的项目实战工作坊爬虫技术在不断发展,持续学习和实践是掌握这一技能的关键希望本课程能为你打开数据获取的新世界,助力你的职业发展和个人成长!。
个人认证
优秀文档
获得点赞 0