96SEO 2026-02-19 12:47 7
Protocol超文本传输协议http是一个基于“请求与响应”模式的、无状态的应用层协议

scheme://host[:post#]/path/……/[?query-string]
名称解释scheme协议例如httphttpsftphost服务器的IP地址或者域名port#服务器的端口如果是走协议默认端口缺省端口80path访问资源的路径query-string参数发送给http服务器的数据anchor锚跳转到网页的指定锚点位置
当获取的网页代码出现乱码时可能就是编码格式不一样手动设置编码格式
‘URL是通过HTTP协议存取资源的Internet路径一个URL对应一个数据资源
表达式描述用法说明nodename选取此节点的所有子节点div选取div下的所有标签//从全局节点中选择节点任意位置均可//div选取整个HTML页面的所有div标签/选取某个节点下
的节点//head/title选取head标签下的title标签选取某个属性的节点//div[id]选取带有id属性的div标签.当前节点下./span选取当节点下的span标签【代码中威力强大】
etree.HTML(内容)将不是html的格式的内容转换成html
etree.tostring(内容encoding‘UTF-8’).decode(‘UTF-8’):如果不是UTF-8编码格式的内容这里可以更改成UTF-8的内容
etree.parse(文件路径)parse对html导入python并解析
如果在浏览器上保存网页到本地在python中获取.html文件需要利用自定解析器来解析文件内容
parseretree.HTMLParser(encodingUTF-8)
htmletree.parse(路径,parserparser)
resultetree.tostring(html,encodingUTF-8).decode(UTF-8)xpath中的[1]表示第一个元素而python中的第一个是从0开始,例如[0]
‘html.parser’)python内置标准库;执行速度适中python2.x或者python3.2x前的版本中文文档容错能力差lxml
‘xml’)速度快唯一支持XML的解析器需要安装c语言库html5libsoup
‘html5lib’)最好的容错性以浏览器的方式解析文档生成HTML5格式的文档不依赖外部扩展库速度慢
soup.find_all(‘标签’属性的键值对)soup.find_all(‘标签’attrs{键值对1键值对2})
soup.find_all(‘标签’属性的键值对1属性的键值对2)
如果在获取时出现python关键字与属性冲突时在获取的时候添加一个下划线
soup.find_all(divclass_position)获取标签属性值
alist:hrefa.attrs[href]print(href)获取标签内的文本信息:使用string方法
只提取标签下的字符串adiv.find_all(a)[0].string#
divs:infoslist(div.stripped_strings)
stripped_strings方法是删除列表中的制表符例如:
byte——错误的原因是尝试将字节数据解码为UTF-8编码的字符串时遇到了一个无效的起始字节。
UTF-8是一种流行的Unicode字符编码它使用1到4个字节表示不同的Unicode字符。
如果字节数据不符合UTF-8编码规则就会引发此错误。
response.content.decode(UTF-8,errorsignore)尝试不同的编码方式
如果无法确定字节数据的正确编码方式可以尝试使用不同的编码方式进行解码直到找到一个可以成功解码的方式。
可以使用try-except语句来捕获解码错误并尝试不同的编码方式
data.decode(encoding)breakexcept
else:print(decoded_data)使用chardet库自动检测编码方式
如果无法确定字节数据的正确编码方式可以使用chardet库来自动检测编码方式。
chardet是一个第三方库可以根据字节数据的特征自动检测编码方式。
在Python爬虫中即使代码看起来没有明显语法错误爬取的数据仍然可能为空这通常与以下因素有关
如果爬虫是基于HTML结构编写的而目标网站进行了改版或更新原有的选择器如XPath或CSS
网页上的数据可能是通过JavaScript动态加载的直接爬取HTML源代码可能无法获取这些数据。
此时需要分析网页加载逻辑使用如Selenium、Pyppeteer等工具模拟浏览器行为或者通过分析Ajax请求来间接获取数据。
目标网站可能启用了反爬虫策略比如Cookies验证、User-Agent限制、IP封锁、验证码、登录验证等。
这时需要针对这些策略进行相应的处理比如设置更真实的User-Agent、使用代理IP池、处理验证码或模拟登录。
请求头信息headers、cookies、POST数据等参数可能需要特殊配置才能获取数据如果缺少必要参数或参数不正确服务器可能不会返回有效数据。
即使代码看似没问题网络连接不稳定或服务器端出现问题也可能导致无法获取数据。
数据解析环节可能出现问题例如正则表达式匹配不正确或者在解析HTML或JSON时引用了不存在的键或属性。
若爬取的是API接口可能存在调用频率限制、API密钥失效或没有必要的授权。
如果爬虫有缓存机制并且缓存了错误的结果新的爬取可能会直接读取缓存而非从服务器获取新数据。
检查并确认请求网址是否正确且能够正常访问使用开发者工具查看网页加载过程确认数据是如何加载和呈现的检查请求头和请求体是否符合目标网站的要求检查解析代码逻辑特别是提取数据的部分检测网络状况以及是否有反爬措施调整爬虫策略对于动态加载内容确保相应脚本能够正确执行或模拟针对可能出现的API限制合理安排请求间隔遵循网站的使用协议。
Expression是使用单个字符串来描述、匹配某个句法规则的字符串常被用来检索、替换那些符合某个模式规则的文本正则的三个基础方法import
re1.1从头开始搜索开头第一个如果不匹配则匹配不成功re.match(匹配规则
搜索整个容器匹配则成功不匹配返回Nonere.search(匹配规则
标记表示当前字符串是原始字符串即内部的转义字符无效而是普通字符1.5
匹配前一个规则的字符出现0次或者1次4{m}:匹配前一个规则的字符出现m次5{m,}匹配前一个规则的字符出现最少m次6{m,n}匹配前一个规则的字符出现m到n次1.6
contentresponse.content保存数据wb是写入比特流数值
文本工具类IDE集成工具类IDEIDLEPycharmNotepadWingSublime
方法说明requests.request()构造一个请求支撑以下各方法的基础方法requests.get()获取html网页的主要方法对应于http的getrequests.head()获取html网页头信息的方法对应于http的headrequests.post()向html网页提交post请求的方法对应于http的postrequests.put()向html网页提交put请求的方法对应于http的putrequests.patch()向html网页提交局部修改请求对应于http的patchrequests.delete()向html页面提交删除请求对应http的delete
假设url位置有一组数据UserInfo包括UserID、UserName等20个字段
采用put必须将所有20个字段一并提交到url未提交字段被删除
属性说明r.statu_codehttp请求的返回状态200表示连接成功其他表示失败或者另有原因r.texthttp响应内容的字符串形式即url对应的页面内容r.encoding从http
header中猜测的响应内容编码方式r.apparent_encoding从内容中分析出的响应内容编码方式(备选编码方式)r.contenthttp响应内容的二进制形式
异常说明requests.ConnectionError网络连接错位于异常如DNS查询失败拒绝连接等requests.HTTPErrorhttp错误异常requests.URLRequiredurl缺失异常requests.TooManyRedirects超过最大重定向次数产生重定向异常requests.ConnectTimeout连接远程服务器超时异常requests.Timeout请求URL超时产生超时异常r.raise_for_status()
【response】如果不是200产生异常requests.HTTPError
getHTMLText(url):try:rrequests.get(url,timeout30)#
如果状态不是200引发HTTPError异常r.raise_for_status()r.encodingr.apparent_encodingreturn
__mian__:urlhttp://www.baidu.comprint(getHTMLText(url))(4)
参数说明1params跟在url连接后面查询搜索的含义字典或者字流格式2data终点作为向服务器提供或提交资源时使用字典、字节序列或文件对象作为Request的内容3jsonJSON格式的数据作为Request的内容4headers字典、HTTP定制头5cookies字典或CookieJarRequest中的cookie6auth元组支持HTTP认证功能7files字典类型传输文件8timeout设定超时时间秒为单位9poroxies字典类型设定访问代理服务器可以增加登录认证10allow_redirectsTrue/False,默认为True重定向开关11streamTrue/False,默认为True获取内容立即下载开关12verifyTrue/False,默认为True认证SSL证书开关13cert本地SSL证书路径
https://example.com/search?queryPython爬虫page1data
json参数的作用是简化向API发送JSON数据的过程确保了数据的正确序列化和HTTP头部的恰当设置非常适合与那些期望接收JSON输入的现代Web服务交互。
注意requests库内部会自动将data转换为JSON字符串
并设置Content-Type为application/json
data是一个Python字典通过jsondata传递给requests.post方法后requests会将其转换为JSON字符串{key:
ano***r_value}并设置请求头以表明发送的是JSON格式的数据。
headers
实际上是http头的相关域它对应了向某一个url访问时所发起的http头字段利用这个字段定制某个访问url的http的协议头
指定客户端的信息很多网站会根据这个字段判断访问者是浏览器还是爬虫有时需要将其设置为常见的浏览器字符串来避免被识别为爬虫。
Accept-Language:
指定客户端接受的语言种类可以帮助获取特定语言的网页内容。
Content-Type:
当发送POST请求且包含请求体时这个字段指定了数据的格式如application/x-www-form-urlencoded、application/json等。
Authorization:
如果网站需要认证可以通过这个字段提供Token或其他认证信息。
en-US,en;q0.9,zh-CN;q0.8,zh;q0.7,
从http中解析cookies它可以是字典也可以是cookieJar形式
解释通过cookies参数携带相应的cookie信息可以使爬虫模拟已登录用户的行为访问那些需要登录后才能查看的内容。
这在爬取需要身份验证的网站数据时尤为重要。
作用cookies参数在Python爬虫中的作用是模拟浏览器的cookie机制帮助爬虫程序绕过登录限制访问受保护的内容或是维持与服务器的会话状态提高数据抓取的准确性和效率。
字段是一个元组类型它是支持http认证功能的auth参数可以是一个元组通常包含用户名和密码或者是一个AuthBase的子类实例用于自定义认证方案。
https://api.example.com/private
APITokenAuth(requests.auth.AuthBase):def
对于支持OAuth的API虽然直接通过auth参数处理可能较为复杂通常需要先通过一系列步骤获取访问令牌但也可以根据具体流程封装认证逻辑到自定义的AuthBase子类中。
通过合理使用auth参数Python爬虫能够安全有效地访问那些需要认证的资源确保了数据请求的合法性与安全性。
files
print(response.text)在这个例子中我们首先打开要上传的图片文件并以二进制模式读取(rb)。
然后我们将文件信息构造成一个字典其中键
是服务器端预期接收文件的字段名值是一个元组包含文件名这里也可以是任意字符串服务器端可能会用作文件名、文件对象和文件的MIME类型。
最后通过requests.post()方法发送POST请求并将这个字典作为files参数传入。
files参数的使用让Python爬虫能够执行涉及文件上传的任务如图片上传、文件分享网站的数据抓取等场景。
用于设置网络请求的超时时间如果一个请求超过指定的秒数还没有得到响应requests库将会抛出一个异常而不是无限期地等待下去
请求https://example.com在5秒内没有得到服务器的响应程序将不会一直等待而是立即执行except块中的代码打印出“请求超时”的信息proxies
参数用于配置HTTP或HTTPS代理服务器。
代理服务器作为中间人可以接收你的爬虫程序发出的网络请求然后转发给目标服务器并将响应结果再返回给你的爬虫。
匿名性隐藏真实IP地址防止被目标网站识别和封锁尤其是在进行大量请求时减少被封禁的风险。
地域限制绕过通过选择不同地区的代理服务器可以访问地理位置受限的内容或服务比如某些网站仅对特定国家或地区开放。
性能优化如果目标服务器对你的物理位置响应较慢使用地理位置更近的代理服务器可以加快访问速度。
负载均衡和带宽管理企业级应用中可能会利用代理服务器来分配请求优化网络资源使用。
requests.get(http://example.com,
proxiesproxies)代码解释proxies参数是一个字典其中键为协议名“http”
“https”值为代理服务器的URL包括协议、地址和端口。
这样所有通过requests发起的请求都会通过指定的代理服务器进行。
注意使用代理时应遵守目标网站的使用条款和服务协议合法合规地进行数据抓取尊重网站的Robots协议并尽量减少对目标服务器的负担。
同时选择稳定可靠的代理服务对于爬虫的成功运行至关重要。
requests库会自动处理重定向即自动向新的URL发送请求。
当设置为False时则不自动处理重定向而是直接返回原始的重定向响应。
requests.get(http://example.com/redirect,
requests.get(http://example.com/redirect,
print(response.headers[location])
解释在使用Python的requests库进行网络请求时stream参数是一个非常实用的选项它的主要作用是控制是否立即下载响应内容。
当设置streamTrue时requests不会立即下载整个响应体而是等到你需要时才按需读取这对于大文件下载或者仅需处理部分响应内容的场景非常有用stream参数的作用
节省内存对于大型文件的下载如果直接下载整个响应体到内存中可能会消耗大量内存资源。
使用streamTrue可以让数据边下载边处理减少内存占用。
按需读取当你只想读取响应的一部分内容而不是全部时使用流式处理可以更加高效。
例如你可能只需要检查响应的前几行来决定是否继续下载剩余内容。
长时间运行的连接在某些情况下保持连接打开并逐步处理响应内容是有益的比如实时数据流处理。
http://example.com/large_file.zip
response.iter_content(chunk_size1024):
verifyTrue这意味着requests会验证服务器的SSL证书确保与之建立的HTTPS连接是安全的可以防止中间人攻击。
有时候你可能需要关闭这个验证比如在测试环境中或者当遇到自签名证书self-signed
certificate或证书链不完整的情况这时可以将verify设置为False。
不过这样做会降低安全性应该谨慎考虑并仅在确信不会导致安全问题的情况下使用。
cert参数可以接收一个表示客户端证书文件路径的字符串或者一个包含证书文件路径和私钥文件路径的元组。
cert
参数用于指定HTTPS请求时的客户端证书。
当目标网站或API需要客户端提供安全证书进行身份验证时就需要用到这个参数。
这对于访问那些启用了客户端证书认证的HTTPS服务尤为重要比如一些内部系统、银行接口或是高度安全的API。
https://example.com/api/secure-endpoint
90%中规模数据规模较大爬取速度敏感Scrapy库大规模搜索引擎爬取速度关键定制开发爬取网页
网络爬虫的“性能骚扰”web服务器默认接收人类访问。
受限于编写水平和目的网络爬虫将会为Web服务带来巨大的资源开销
网络爬虫可能具备突破简单访问控制的能力获得被保护数据从而泄露个人隐私
检查来访Http协议头的User-Agent域只响应浏览器或友好爬虫的访问
Standard网络爬虫排除标准协议是机器人的意思。
robots协议是放在网站的根下的robots.txt文件
网络爬虫自动或人工识别robots.txt再进行内容爬取。
约束性Robots协议是建议但非约束性网络爬虫可以不遵守但存在法律风险。
http://www.baidu.com/robots.txt
http://www.news,sina.com.cn/robots.txt
http://www.moe.edu.cn/robots.txt
urlhttps://item.jd.com/100077414769.html
try:rrequests.get(url)r.raise_for_status()
如果状态码是200则正常运行r.encodingr.apparent_encodingprint(r.text[:1000])
requestsurlhttps://www.amazon.cn/gp/product/B01M8L5Z3Y
try:rrequests.get(url,headersheaders)r.raise_for_status()
如果状态码是200则正常运行r.encodingr.apparent_encodingprint(r.text)
http://www.baidu.com/s?wdkeyword
requestsurlhttp://www.baidu.com/s
try:kv{wd:Python}rrequests.get(url,paramskv)print(r.request.url)r.raise_for_status()
如果状态码是200则正常运行print(r.request.url)print(r.text)
try:kv{q:Python}rrequests.get(url,paramskv)print(r.request.url)r.raise_for_status()
urlhttp://image.nationalgeograhic.com.cn/2017/20170211061910157.jpg
os.path.exists(root):os.mkdir(root)if
f:f.write(r.content)f.close()print(文件保存成功)else:print(文件已存在)
requestsurlhttp://m.ip138.com/ip.asp?ip
try:rrequests.get(url202.204.80.112)r.raise_for_status()r.encodingr.apparent_encodingprint(r.text[-500:])
基本元素说明Tag标签最基本的信息组织单元分别用和/标明开头和结尾Name标签的名字……的名字是‘p’格式.nameAttributes标签的属性字典形式组织格式.attrsNavigableString标签内非属性字符串……/中字符串格式.stringComment标签内字符串的注释部分一种特殊的Comment类型
urlhttp://python123.io/ws/demo.html
try:responserequests.get(url)response.raise_for_status()htmlresponse.textsoupBeautifulSoup(html,html.parser)titlesoup.titleasoup.aprint(title,a)
urlhttp://python123.io/ws/demo.html
try:responserequests.get(url)response.raise_for_status()htmlresponse.textsoupBeautifulSoup(html,html.parser)titlesoup.title.name
urlhttp://python123.io/ws/demo.html
try:responserequests.get(url)response.raise_for_status()htmlresponse.textsoupBeautifulSoup(html,html.parser)asoup.aida.attrs
urlhttp://python123.io/ws/demo.html
try:responserequests.get(url)response.raise_for_status()htmlresponse.textsoupBeautifulSoup(html,html.parser)psoup.p.stringprint(p)
BeautifulSoupsoupBeautifulSoup(b!--This
comment/p,html.parser)print(type(soup.b.string))
属性说明.contents子节点的列表将所有儿子节点存入列表.children子节点的迭代类型与.contents类似用于循环遍历儿子节点.descendants子孙节点的迭代类型包含所有子孙节点用于循环遍历
urlhttp://python123.io/ws/demo.html
soupBeautifulSoup(response.text,html.parser)
urlhttp://python123.io/ws/demo.html
soupBeautifulSoup(response.text,html.parser)
soup.body.children:print(child)
soup.body.descendants:print(child)(3)
属性说明.parent节点的父亲标签.parents节点先辈标签的迭代类型用于循环遍历辈点
urlhttp://python123.io/ws/demo.html
soupBeautifulSoup(response.text,html.parser)
None:print(parent)else:print(parent.name)(4)
属性说明.next_sibling返回按照HTML文本顺序的下一个平行节点标签.previous_sibling返回按照HTML文本顺序的上一个平行节点标签.next_siblings迭代类型返回按照HTML文本顺序的后续所有平行节点标签.previous_siblings迭代类型返回按照HTML文本顺序的前续所有平行节点标签
urlhttp://python123.io/ws/demo.html
soupBeautifulSoup(response.text,html.parser)
a1soup.a.next_sibling.next_sibling
a3soup.a.previous_sibling.previous_sibling
soup.a.next_sibling:print(sibling)
soup.a.previous_sibling:print(sibling).prettify()为HTML文本及其内容增加更加”\n“
urlhttp://python123.io/ws/demo.html
soupBeautifulSoup(response.text,html.parser)
print(soup.prettify())八、信息组织与提取方法
key:{subkey:subvalue}信息有类型适合程序处理(js)较XML简洁移动应用云端和节点的信息通信无注释
key:subkey:subvlaue信息无类型文本信息比例最高可读性好各类系统的配置文件有注释易读
--最早的通用信息标记语言可扩展性好但繁琐。
Internet上的信息交互与传递
完整解析信息的标记形式再提取关键信息。
XML、JSON、YAML
结合形式解析与搜索方法提取关键信息。
XML、JSON、YAML、搜索。
需要标记解析器及文本查找函数。
.find_all(name,attrs,recursive,string,**kwargs)返回一个列表类型存储查找的结果
rrequests.get(http://python123.io/ws/demo.html).text
soupBeautifulSoup(r,html.parser)
rrequests.get(http://python123.io/ws/demo.html).text
soupBeautifulSoup(r,html.parser)
soup.find_all(True):print(tag.name)#
rrequests.get(http://python123.io/ws/demo.html).text
soupBeautifulSoup(r,html.parser)
link1soup.find_all(id[link1,class])
rrequests.get(http://python123.io/ws/demo.html).text
soupBeautifulSoup(r,html.parser)
linksoup.find_all(idre.compile(lin))
rrequests.get(http://python123.io/ws/demo.html).text
soupBeautifulSoup(r,html.parser)
asoup.find_all(a,recursiveFalse)
rrequests.get(http://python123.io/ws/demo.html).text
soupBeautifulSoup(r,html.parser)
pythonsoup.find_all(stringre.compile(py))
方法说明.find()搜索且只返回一个结果字符串类型同.find_all参数.find_parents()在先辈节点中搜索返回列表类型同.find_all参数.find_parent()在先辈节点中返回一个结果字符串类型同.find_all参数.find_next_siblings()在后续平行节点中搜索返回列表类型同.find_all参数.find_next_sibling()在后续平行节点中返回一个结果字符串类型同.find_all参数.find_previous_siblings()在前序平行节点中搜索返回列表类型同.find_all参数.find_previous_sibling()在前序平行节点中返回一个结果字符串类型同.find_all参数
rrequests.get(http://python123.io/ws/demo.html).text
soupBeautifulSoup(r,html.parser)
soup.find_all(a):提取属性的三种方法print(link[href])print(link.get(href))print(link.attrs[href])特soup(…)
步骤1从网络上获取大学排名网页内容——getHTMLText()步骤2提取网页内容中信息到合适的数据结构——fillUnivList()步骤3利用数据结构展示并输出结果——printUnivList()
右对齐^剧中对齐槽的设定输出宽度数字的千位分隔符适用于整数和浮点数浮点数小数部分的精度或字符串的最大输出长度整数类型b,c,d,o,x,X浮点数类型e,E,f,%
中文对齐问题的解决当中文字符宽度不够时采用西文字符填充中西文字符占用宽度不同采用中文字符的空格填充chr(12288).
代码块Python网络爬虫与信息提取_中国大学MOOC(慕课)
getHTMLText(url):try:rrequests.get(url,timeout30)r.raise_for_status()r.encodingr.apparent_encodingreturn
soup.find_all(tbody).children:#
检测tr标签的类型的类型如果tr标签的类型不是bs4库定义的tag类型将过滤掉if
isinstance(tr,bs4.element.Tag):tdstr(td)ulist.append([tds[0].string,tds[1].string,tds[2].string])def
num):tplt{0:10}\t{1:{3}^10}\t{2:^10}print({:10}\t{:^6}\t{:^10}.format(排名,学校名称,总分))for
range(num):uulist[i]print(tplt.format(u[0],u[1],u[2],chr(12288)))def
main():uinfo[]urlhtmlgetHTMLText(url)fillUnivList(uinfo,html)printUnivList(uinfo,20)
通用的字符串表达框架简洁表达一组字符串的表达式针对字符串表达“简洁”和“特征”思想的工具判断某字符串的特征归属
表达式文本类型的特征病毒、入侵等同时查找或替换一组字符串匹配字符串的全部或部分
]字符集对单个字符给出取值范围[abc]表示a、b、c[a-z]表示a到z单个字符[^
]非字符集对单个字符给出排除范围[^abc]表示非a或b或c的单个字符*前一个字符0次或无限次扩展abc*表示ab、abc、abcc、abcc等前一个字符1次或无限次扩展abc表示abc、abcc、abccc等?前一个字符0次或1次扩展abc表示av、abc|左右表达式任意一个abc|def表示abc、def{m}扩展前一个字符m次ab{2}c表示abbc{m,n}扩展前一个字符m至n次(含n)ab{12}c表示abc、abbc^匹配字符串开头^abc表示abc且在一个字符串的开头$匹配字符串结尾abc$表示abc且在一个字符串的结尾()分组标记内部只能使用|操作符(abc)表示abc(abc|def)表示abc、def\d数字等价于[0-9]\w单词字符等价于[A-Za-z0-9]
string)在一个字符串中搜索匹配正则表达式的第一个位置返回match对象re.match(pattern,
string)从一个字符串的开始位置起匹配正则表达式返回match对象re.findall(pattern,
string)搜索字符串以列表类型返回全部能匹配的子串re.split(pattern,
string)将一个字符串按照正则表达式匹配结果进行分割返回列表类型re.finditer(pattern,
string)搜索字符串返回一个匹配结果的迭代类型每个迭代元素是match对象re.sub(pattern,
string)在一个字符串中替换所有匹配正则表达式的字串返回替换后的字符串re.compile(pattern[,
stringflags0)pattern正则表达式的字符串或原生字符串表示string待匹配字符串flags正则表达式使用时的控制标记
在字符串中搜索匹配正则表达式pattern的第一个位置返回一个匹配对象如果没有找到匹配的则返回None。
else:print(未找到匹配)re.match(pattern,
从字符串的起始位置匹配正则表达式pattern如果起始位置没有匹配到则返回None。
注意这与search()不同search()会扫描整个字符串以查找匹配项。
else:print(未找到匹配)re.findall(pattern,
返回字符串中所有与正则表达式pattern相匹配的所有非重叠匹配项的列表。
如果未找到匹配项则返回空列表。
将字符串中所有与正则表达式pattern匹配的部分替换为repl并返回修改后的字符串。
count参数可以指定替换的最大次数默认为0表示替换所有匹配项。
编译正则表达式字符串为一个正则表达式对象这样可以提高使用相同模式进行多次匹配的效率。
match.group())re.escape(string):
转义字符串中的特殊字符使得它们在正则表达式中作为字面值字符对待。
match.group())re.split(pattern,string,maxsplit0,flags0):
result1re.split(r[1-9]\d{5},BIT100081
result2re.split(r[1-9]\d{5},BIT100081
print(result2)re.finditer(pattern,
搜索字符串返回一个匹配结果的迭代类型每个迭代元素是match对象
re.finditer(r[1-9]\d{5},BIT100081
match:print(match.group(0))print(type(match))match对象的属性
属性说明.string待匹配的文本.re匹配时使用的patter对象正则表达式.pos正则表达式搜索文本的开始位置.endpos正则表达式搜索文本的结束位置match对象的方法
方法说明.group(0)获得匹配的字符串.start()匹配字符串在原始字符串的开始位置.end()匹配字符串在原始字符串的结束位置.span()返回(.start(),.end())import
matchre.search(r[1-9]\d{5},BIT100081
matchre.search(rPY.*N,PYANBNCNDN)
print(match.group(0))最小匹配如何输出最短的子串呢
matchre.search(rPY.*?N,PYANBNCNDN)
操作符说明*前一个字符0次或无限次扩展最小匹配前一个字符1次或无限次扩展最小匹配前一个字符0次或1次扩展最小匹配{mn}扩展前一个字符m至n次含n最小匹配
在Python中可以使用re模块正则表达式模块来匹配IP地址。
一个基本的IPv4地址由四个0到255之间的数字组成每部分之间用点(“.”)分隔。
下面是一个简单的例子展示了如何编写一个正则表达式来匹配这样的IP地址
re.compile(r^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$)#
{is_valid_ip(ip)})这段代码首先导入了re模块并定义了一个函数is_valid_ip该函数使用一个正则表达式来检查输入的字符串是否符合IPv4地址的格式。
正则表达式的详细解释如下
^表示字符串的开始。
((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}这部分匹配前三部分的数字每部分数字范围是0到255后面跟着一个点(“.”)。
其中
表示匹配点字符本身因为点在正则表达式中有特殊含义所以需要用反斜杠转义。
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$这部分匹配第四部分的数字后面跟上字符串的结束标志$。
0-9]$由26个字母和数字组成的字符串^-?\d$整数形式的字符串^
{3}-d{8}|\d{4}-\d{7}国内电话号码010-68913536
目标获取淘宝搜索页面的信息提取其中的商品名称和价格理解淘宝的搜索接口、翻页的处理技术路线requests-re
https://s.taobao.com/search?initiative_idstaobaoz_20240525page1q%E4%B9%A6%E5%8C%85taball
https://s.taobao.com/search?initiative_idstaobaoz_20240525page2q%E4%B9%A6%E5%8C%85taball
https://s.taobao.com/search?initiative_idstaobaoz_20240525page3q%E4%B9%A6%E5%8C%85taball
https://s.taobao.com/search?page2q%E4%B9%A6%E5%8C%85taball
https://s.taobao.com/search?page1q%E4%B9%A6%E5%8C%85taball
https://s.taobao.com/search?page3q%E4%B9%A6%E5%8C%85taball步骤2对于每个页面提取商品名称和价格信息
timeout30)r.raise_for_status()r.encoding
re.findall(r\view_price\\:\[\d\.]*\,html)tlt
re.findall(r\raw_title\\:\.*?\,html)for
eval(tlt[i].split(:)[1])ilt.append([price
{:4}\t{:8}\t{:16}print(tplt.format(序号,
getHTMLText(url)parsePage(infoList,
html)except:continueprintGoodsList(infoList)main()十二、实例股票数据定向爬虫
目标获取上交所和深交所所有股票的名称和交易信息输出保存到文件中技术路线requests-bs4-re
新浪股票:http://finance.sina.com.cn/stock/
百度股票:https://gupiao.baidu.com/stock/选取原则股票信息静态存在于HTML页面中非js代码生成没有Robots协议限制。
选取方法浏览器F12源代码查看等。
选取心态不要纠结于某个网络多找信息源选择尝试
东方财富网http://quote.eastmoney.com/stocklist.html
百度股票https://gupiao.baidu.com/stock/
单个股票https://gupiao.baidu.com/stock/sz002439.html步骤1从东方财富网获取股票列表
requests.get(url)r.raise_for_status()r.encoding
i.attrs[href]lst.append(re.findall(r[s][hz]\d{6},
soup.find(div,attrs{class:stock-bets})name
stockInfo.find_all(attrs{class:bets-name})[0]infoDict.update({股票名称:
stockInfo.find_all(dt)valueList
{:.2f}%.format(count*100/len(lst)),end)except:count
{:.2f}%.format(count*100/len(lst)),end)continuedef
http://quote.eastmoney.com/stocklist.htmlstock_info_url
https://gupiao.baidu.com/stock/output_file
D:/BaiduStockInfo.txtslist[]getStockList(slist,
stock_list_url)getStockInfo(slist,
爬虫框架是实现爬虫功能的一个软件结构和功能组件集合爬虫框架是一个半成品能够帮助用户实现专业网络爬虫
Engine从Spider处获得爬取请求RequestsEngine将爬取请求转发给Scheduler用于调度Engine从Scheduler处获得下一个要爬取的请求Engine将爬取请求通过中间件发送给Downloader爬取网页后Downloader形成响应Response通过中间件发给EngineEngine将收到的响应通过中间件发送给Spider处理Spider处理响应后产生爬取项scraped
Item和新的爬取请求requests给EngineEngine将爬取项发送给Item
Pipeline框架出口Engine将爬取请求发送给Scheduler
Engine控制各模块数据流不间断从Scheduler处获得爬取请求直至请求为空
解析Downloader返回的响应Response产生爬取项scraped
产生的爬取项。
由一组操作顺序组成类似流水线每一个操作是一个Item
Pipeline类型可能操作包括清理、检验和查重爬取项中的HTML数据、将数据存储到数据库。
目的实施Engine、Scheduler和Downloader之间进行用户可配置的控制
两者都可以进行页面请求和爬取Python爬虫的两个重要技术路线。
两者可用性都好文档丰富入门简单。
两者都没有处理js、提交表单、应对验证码等功能可扩展
requestsScrapy页面级爬虫网站级爬虫功能库框架并发性考虑不足性能较差并发性性能较好终点在于页面下载终点在于爬虫结构定制灵活一般定制灵活深度定制困难上手十分简单入门稍难
非常小的需求requests库不太小的需求Scrapy框架定制程度很高的需求不考虑规模自搭框架requests
Scrapy是为持续运行设计的专业爬虫框架提供操作的Scraoy命令行
command[options][args]序号命令说明格式1startproject创建一个新工程scrapy
命令行不是图形界面更容易自动化适合脚本控制本质上Scrapy是给程序用的功能而不是界面更重要。
步骤1创建一个工程和Spider模板步骤2编写Spider步骤3Item
创建工程生成工程】包含scrapy.cfg【部署Scrapy爬虫的配置文件】生成的工程
python123demo/Scrapy框架的用户自定义的配置文件
middlewares.pyMiddlewares代码模块继承类
D:\Software\python3.12.2\Lib\site-packages\scrapy\templates\project,
in:E:\Hui\爬虫\自修案例\python123demoYou
E:\Hui\爬虫\自修案例\python123demoscrapy
module:python123demo.spiders.demospiders/Spiders代码模块目录继承类
最开始用户提交给命令行的域名指的是爬虫在爬取网站的时候它只能爬取这个域名以下的相关链接allowed_domains
以列表形式包含的一个或多个url就是scrapy框架所要爬取的初始页面start_urls
[https://python123.io]#解析页面的空方法用于处理响应解析内容形成字典发现新的url爬取请求def
最开始用户提交给命令行的域名指的是爬虫在爬取网站的时候它只能爬取这个域名以下的相关链接#
以列表形式包含的一个或多个url就是scrapy框架所要爬取的初始页面start_urls
[http://python123.io/ws/demo.html]#解析页面的空方法用于处理响应解析内容形成字典发现新的url爬取请求def
将response响应的内容写入html文件中fnaemresponse.url.split(/)[-1]with
f:f.write(response.body)self.log(fSaved
保存在E:\Hui\爬虫\自修案例\python123demo
E:\Hui\爬虫\自修案例\python123demoscrapy
twisted.internet.asyncioreactor.AsyncioSelectorReactor
asyncio.windows_events._WindowsSelectorEventLoop
[scrapy.extensions.corestats.CoreStats,scrapy.extensions.telnet.TelnetConsole,scrapy.extensions.logstats.LogStats]
python123demo,FEED_EXPORT_ENCODING:
python123demo.spiders,REQUEST_FINGERPRINTER_IMPLEMENTATION:
[python123demo.spiders],TWISTED_REACTOR:
twisted.internet.asyncioreactor.AsyncioSelectorReactor}
[scrapy.downloadermiddlewares.offsite.OffsiteMiddleware,scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware,scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware,scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware,scrapy.downloadermiddlewares.defaul***aders.DefaultHeadersMiddleware,scrapy.downloadermiddlewares.useragent.UserAgentMiddleware,scrapy.downloadermiddlewares.retry.RetryMiddleware,scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware,scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware,scrapy.downloadermiddlewares.redirect.RedirectMiddleware,scrapy.downloadermiddlewares.cookies.CookiesMiddleware,scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware,scrapy.downloadermiddlewares.stats.DownloaderStats]
[scrapy.spidermiddlewares.httperror.HttpErrorMiddleware,scrapy.spidermiddlewares.referer.RefererMiddleware,scrapy.spidermiddlewares.urllength.UrlLengthMiddleware,scrapy.spidermiddlewares.depth.DepthMiddleware]
[scrapy.downloadermiddlewares.redirect]
https://python123.io/robots.txt
https://python123.io/robots.txt
[scrapy.downloadermiddlewares.redirect]
https://python123.io/ws/demo.html
http://python123.io/ws/demo.html
https://python123.io/ws/demo.html
https://python123.io/ws/demo.html
D:\Software\python3.12.2\Lib\site-packages\twisted\internet\defer.py,
ignore[misc]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File
D:\Software\python3.12.2\Lib\site-packages\scrapy\spiders\__init__.py,
**kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File
E:\Hui\爬虫\自修案例\python123demo\python123demo\spiders\demo.py,
4,downloader/request_method_count/GET:
1981,downloader/response_count:
4,downloader/response_status_count/200:
1,downloader/response_status_count/301:
2,downloader/response_status_count/404:
tzinfodatetime.timezone.utc),log_count/DEBUG:
1,robotstxt/response_status_count/404:
生成器是一个不断产生值的函数包含yield语句的函数时一个生成器生成器每次产生一个值yield语句函数被冻结被唤醒后再产生一个值。
最开始用户提交给命令行的域名指的是爬虫在爬取网站的时候它只能爬取这个域名以下的相关链接#
以列表形式包含的一个或多个url就是scrapy框架所要爬取的初始页面start_urls
[http://python123.io/ws/demo.html]#解析页面的空方法用于处理响应解析内容形成字典发现新的url爬取请求def
将response响应的内容写入html文件中fnaemresponse.url.split(/)[-1]with
f:f.write(response.body)self.log(fSaved
start_requests(self):urls[http://python123.io/ws/dem.html]for
scrapy.Request(urlurl,callbackself.parse)def
parse(self,response):fnameresponse.url.split()[-1]with
f:f.write(response.body)self.log(fSaved
Request对象表示一个HTTP请求由Spider生成由Downloader执行
属性或方法说明.urlRequest对应的请求url地址.method对应的请求方法‘GET’‘PODT’等.headers字典类型风格的请求头.body请求内容主体字符串类型.meta用户添加的扩展信息在Scrapy内部模块间传递信息使用.copy()复制该请求
Response对象表示一个HTTP响应。
由Downloader生成由Spider处理
属性或方法说明.urlResponse对应的请求url地址.statusHTTP状态码默认是200.headersRespnse对应的头部信息.bodyResponse对应的内容信息字符串类型.flags一组标记.request产生Response类型对应的Request对象.copy()复制该响应
Item对象表示一个从HTML页面中提取的信息内容由Spider生成由Item
Pipeline处理。
Item类型字典类型可以按照字典类型操作。
HTML.css(a::attr(href)).extract()
D:\Software\pycharm\web_requestscrapy
D:\Software\python3.12.2\Lib\site-packages\scrapy\templates\project,
in:D:\Software\pycharm\web_request\BaiduStocksYou
D:\Software\pycharm\web_requestcd
D:\Software\pycharm\web_request\BaiduStocksscrapy
module:BaiduStocks.spiders.stocks进一步修改spiders/stocks.py文件
配置stocks.py文件修改对返回页面的处理修改对新增URL爬取请求的处理
StocksSpider(scrapy.Spider):name
[http://quote.eastmoney.com/stocklist.html]def
.extract()这个方法应用于前面的选择器表达式结果上用于从选择器匹配到的所有元素中提取出实际的文本内容。
for
response.css(a::attr(href)).extract():try:#
匹配正确的url链接stockre.findall(r[s][hz]\d{6},href)[0]#
组成个股链接urlhttps://gupiao.baidu.com/stock/stock.htmlyield
scrapy.Request(url,callbackself.parse_stock)except:continuedef
stockInfo.css(.bets-name).extract()[0]keyList
stockInfo.css(dt).extract()valueList
valueList[i])[0][0:-5]except:val
BaidustocksPipeline(object):def
BaidustocksInfoPipeline(object):def
\nself.f.write(line)except:passreturn
{BaiduStocks.pipelines.BaidustocksInfoPipeline:
D:\Software\pycharm\web_request\BaiduStocksscrapy
D:\Software\pycharm\web_request\BaiduStocks\BaiduStocks\spiders\stocks.py:39:
D:\Software\pycharm\web_request\BaiduStocks\BaiduStocks\spiders\stocks.py:40:
twisted.internet.asyncioreactor.AsyncioSelectorReactor
asyncio.windows_events._WindowsSelectorEventLoop
[scrapy.extensions.corestats.CoreStats,scrapy.extensions.telnet.TelnetConsole,scrapy.extensions.logstats.LogStats]
BaiduStocks,FEED_EXPORT_ENCODING:
BaiduStocks.spiders,REQUEST_FINGERPRINTER_IMPLEMENTATION:
[BaiduStocks.spiders],TWISTED_REACTOR:
twisted.internet.asyncioreactor.AsyncioSelectorReactor}
[scrapy.downloadermiddlewares.offsite.OffsiteMiddleware,scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware,scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware,scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware,scrapy.downloadermiddlewares.defaul***aders.DefaultHeadersMiddleware,scrapy.downloadermiddlewares.useragent.UserAgentMiddleware,scrapy.downloadermiddlewares.retry.RetryMiddleware,scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware,scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware,scrapy.downloadermiddlewares.redirect.RedirectMiddleware,scrapy.downloadermiddlewares.cookies.CookiesMiddleware,scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware,scrapy.downloadermiddlewares.stats.DownloaderStats]
[scrapy.spidermiddlewares.httperror.HttpErrorMiddleware,scrapy.spidermiddlewares.referer.RefererMiddleware,scrapy.spidermiddlewares.urllength.UrlLengthMiddleware,scrapy.spidermiddlewares.depth.DepthMiddleware]
[BaiduStocks.pipelines.BaidustocksInfoPipeline]
[scrapy.downloadermiddlewares.offsite]
http://quote.eastmoney.com/robots.txt
[scrapy.downloadermiddlewares.redirect]
http://quote.eastmoney.com/center/gridlist.html#hs_a_board
http://quote.eastmoney.com/stocklist.html
http://quote.eastmoney.com/center/gridlist.html#hs_a_board
选项说明CONCURRENT_REQUESTSDownloader最大并发请求下载数量默认为32CONCURRENT_ITEMSItem
Pipeline最大并发ITEM处理数量默认100CONCURRENT_REQUESTS_PER_DOMAIN每个目标域名最大的并发请求数量默认8CONCURRENT_REQUESTS_PER_IP每个目标IP最大的并发请求数量默认0非0有效
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback