python3爬虫笔记2

1 urlpare模块

urlparse模块主要用于处理URL字符串,它的核心功能是将URL拆分为多个组成部分,并允许你通过名字属性或索引来访问这些部分。通过调用urlparse模块的相关函数,你可以轻松解析URL,获取其不同组件的信息,如协议(scheme)、网络位置(netloc)、路径(path)、参数(parameters)、查询字符串(query)和片段(fragment)。

1.1 链接组成

新建urlpaser_test.py

#!/usr/bin/env python
​
from urllib.parse import urlparse,urlunparse,urlsplit,urlunsplit,urljoin,parse_qs,parse_qsl,quote,unquote
​
url = 'http://www.baidu.com/index.html;user?id=0#comment'
​
# result = urlparse(url=url)
# # print(type(result),result)
# print(result.scheme)
# print(result.netloc)
# print(result.path)
# print(result.params)
# print(result.query)
# print(result.fragment)
​
# result = urlparse(url=url,scheme='https',allow_fragments=False)
# print(result.scheme)
# print(result.fragment)
​
# data = ['http','www.baidu.com','index.html','user','id=0','comment']
# url = urlunparse(data)
# print(url)

效果

1.2 链接解析

当然可以,以下是对您提供的代码添加中文注释的版本:
​
python
#!/usr/bin/env python  
  
# 导入urlparse模块中的多个函数  
from urllib.parse import urlparse, urlunparse, urlsplit, urlunsplit, urljoin, parse_qs, parse_qsl, quote, unquote  
  
# 假设有一个URL字符串  
# url = 'http://www.baidu.com/index.html;user?id=0#comment'  
  
# 使用urlparse函数解析URL  
# result = urlparse(url=url)  
  
# # 打印解析结果及其类型  
# # print(type(result), result)  
  
# # 打印URL的各个组成部分  
# print(result.scheme)       # 协议部分  
# print(result.netloc)       # 网络位置部分  
# print(result.path)         # 路径部分  
# print(result.params)       # 参数部分  
# print(result.query)        # 查询字符串部分  
# print(result.fragment)     # 片段(锚点)部分  
  
# 使用urlparse函数解析URL,并指定协议和不允许片段  
# result = urlparse(url=url, scheme='https', allow_fragments=False)  
  
# 打印指定协议后的结果和片段部分(如果allow_fragments为False,则fragment为None)  
# print(result.scheme)  
# print(result.fragment)  
  
# 使用urlunparse函数将URL的各个组成部分组合成一个完整的URL  
# data = ['http', 'www.baidu.com', 'index.html', 'user', 'id=0', 'comment']  
# url = urlunparse(data)  
# print(url)  
  
# 使用urlsplit函数解析URL,它与urlparse类似,但不解析参数部分  
# url = 'http://www.baidu.com/index.html;user?id=0#comment'  
# result = urlsplit(url)  
  
# 打印urlsplit的解析结果  
# print(result)  
# 打印URL的各个组成部分  
# print(result.scheme)  
# print(result[0])         # 与result.scheme相同  
# print(result.netloc)  
# print(result.path)  
# print(result.query)  
# print(result.fragment)  
  
# 使用urlunsplit函数将URL的各个组成部分(不包括参数部分)组合成一个完整的URL  
# data = ('http', 'www.baidu.com', 'index.html', 'id=0', 'comment')  
# print(urlunsplit(data))  
  
# 使用urljoin函数合并基础URL和相对URL  
# base_url = 'https://www.baidu.com'  
# relative_url = '/path/to/xxxx'  
# url = urljoin(base_url, relative_url)  
# print(url)  
  
# 测试urljoin函数在不同情况下的表现  
# print(urljoin('https://www.baidu.com', '/FAQ.html'))  
# 当相对URL是绝对URL时,它会覆盖基础URL的协议和位置  
# print(urljoin('https://www.baidu.com', 'http://www.mashibing/FAQ.html'))  
# 当相对URL包含协议时,它会覆盖基础URL的协议  
# print(urljoin('https://www.baidu.com/admin.html', 'http://www.mashibing/FAQ.html'))  
# 当相对URL是查询字符串或片段时,它会被添加到基础URL的末尾  
# print(urljoin('https://www.baidu.com?wd=aaa', '?user=1#comment'))  
# print(urljoin('https://www.baidu.com#comment', '?user=1'))  
  
# 使用parse_qs函数解析查询字符串,返回一个字典,字典的键是参数名,值是参数值的列表  
query = 'name=handsomewuyue&age=18'  
print(parse_qs(query))  
  
# 使用parse_qsl函数解析查询字符串,返回一个元组的列表,每个元组包含一个参数名和对应的参数值  
# data = parse_qs(query)  
print(parse_qsl(query))  
  
# 使用quote函数对字符串进行URL编码  
keyword = "美女"  
url = 'https://www.baidu.com/s?wd=' + quote(keyword)  
print(url)  
  
# 使用unquote函数对URL编码的字符串进行解码  
url_1 = unquote(url)  
print(url_1)

2 robot协议

robots协议,也称为爬虫协议、爬虫规则或机器人协议,其全称是“网络爬虫排除标准”(Robots Exclusion Protocol)。这是网站国际互联网界通行的道德规范,旨在保护网站数据和敏感信息,确保用户个人信息和隐私不被侵犯。通过robots协议,网站可以告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。搜索引擎则会通过读取robots.txt文件来识别页面是否允许被抓取。

2.1 robotparser模块

robotparser是Python urllib库中的一个模块,主要用于识别网站的robots.txt文件。robots.txt文件是网站管理员为搜索引擎爬虫(如Googlebot)或其他网络爬虫提供的一个访问控制文件,它指明了哪些爬虫可以访问网站的哪些部分,哪些不能访问。

robotparser模块提供了RobotFileParser类,这个类能够读取、解析URL上的robots.txt文件,并根据文件中的规则来判断特定的爬虫(通过其User-Agent标识)是否允许访问某个URL。

以下是robotparser模块的一些主要方法和功能:

  • set_url(url): 设置指向robots.txt的文件URL。

  • read(): 读取robots.txt的URL并将其输入到解析器中。

  • parse(lines): 解析robots.txt文件,传入的参数是robots.txt文件中的某些行内容。

  • can_fetch(user-agent, url): 判断特定的爬虫(通过其User-Agent)是否可以访问某个URL。

2.2 案例

新建robot_test.py

#!/usr/bin/env python
​
from urllib.robotparser import RobotFileParser
​
#创建一个RobotFileParser对象用于解析robots.txt
robot_parser = RobotFileParser()
robot_parser.set_url('https://www.zhihu.com/robots.txt')
​
#读取并且解析robots.txt
robot_parser.read()
​
#检查是否可以爬取特定的url
user_agent = "BaiduSpider"
check_url = 'https://www.zhihu.com/'
​
#can_ferch
if robot_parser.can_fetch(user_agent,check_url):
    print('可以爬取到这个url')
else:
    print('不可以爬取到这个url')

效果

3 request复习

3.1 案例1

新建requests1.py

#!/usr/bin/env python  
  
import requests  # 导入requests库,用于发起HTTP请求  
  
# 发送GET请求示例  
# r = requests.get('http://httpbin.org/get')  # 发送GET请求到http://httpbin.org/get  
# print(r.text)  # 打印请求返回的文本内容  
  
# 发送带参数的GET请求示例  
# data = {  
#     'name':'handsomewuyue',  # 构造请求参数,name字段  
#     'age':'18'               # 构造请求参数,age字段  
# }  
# r = requests.get('http://httpbin.org/get', params=data)  # 发送带参数的GET请求  
# print(r.text)  # 打印请求返回的文本内容  
  
# 发送POST请求示例  
# data = {  
#     'name':'handsomewuyue',  # 构造POST请求的数据,name字段  
#     'age':'18'               # 构造POST请求的数据,age字段  
# }  
# r = requests.post('http://httpbin.org/post', data=data)  # 发送POST请求  
# print(r.text)  # 打印请求返回的文本内容  
  
# 其他HTTP方法示例(未实际执行)  
# r = requests.put('http://httpbin.org/put')  # 发送PUT请求,需要相应URL支持  
# r = requests.delete('http://httpbin.org/delete')  # 发送DELETE请求,需要相应URL支持  
# r = requests.head('http://httpbin.org/head')  # 发送HEAD请求,只获取响应头  
# r = requests.options('http://httpbin.org/options')  # 发送OPTIONS请求,获取服务器支持的请求方法  
  
# 自定义请求头发送GET请求示例  
headers = {  
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'  # 自定义User-Agent头  
}  
r = requests.get('https://www.zhihu.com', headers=headers)  # 发送带自定义headers的GET请求到知乎首页  
print(r.text)  # 打印请求返回的文本内容  
 

效果

3.2 案例2

新建requests2.py

python
import requests  # 导入requests库,用于发起HTTP请求  
  
# 定义目标URL,这里使用httpbin.org提供的POST请求测试接口  
url = 'http://httpbin.org/post'  
  
# 创建一个字典,用于存放要上传的文件  
# 'file'是上传文件时使用的字段名,open('favicon.ico','rb')打开名为'favicon.ico'的文件,并以二进制模式读取  
files = {'file': open('favicon.ico', 'rb')}  
  
# 使用requests库的post方法发起POST请求,并上传文件  
# files参数用于指定上传的文件  
r = requests.post(url, files=files)  
  
# 打印请求返回的文本内容  
print(r.text)  
  

效果

3.3 案例3

新建requests3.py

import requests
​
url = 'https://www.zhihu.com'
# r = requests.get(url=url)
# print(r.cookies)
# for key,value in r.cookies.items():
#     print(key + '=' + value)
​
headers = {
    'Cookie':'_zap=65985310-a068-4c12-ae0a-56251c2c5c12; d_c0=AbCTugmbSBePTrEOSOMV93HuhQPipyoMkyM=|1692789471; YD00517437729195%3AWM_TID=emVDLGILJsBERAVQVAeAkpebh4G4Aa0t; __snaker__id=zptBm6fqrykPGJWm; YD00517437729195%3AWM_NI=SQ6wtpN50b7JklREIGLJWfA7KXvU0ElY78UhdWVg5RLCcXFSmIutvYWSTxuU4CpLkUPWI2Y4mwYdcmBA086%2BVej4kBzqutG6WzywEoor7JT9in6Xt7l1sOIXt%2ByjYphdTVg%3D; YD00517437729195%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee83aa66a1ecfd96eb4b8ea88aa7c44e838b8a87c56297abf990f15cf68e9887d02af0fea7c3b92a918ffa98f77c8eeb0083b642a9b49ea6cc4d90969987c43d8988bab6b34fb087f9d9d864a8899a88b85a909dadb9c559af97bb95f553958d9c99f85ff89dc0adea5f948987d3dc40afa99785e267829f00d9b52196bba6d5ea4abaafbb95c63e95a6b798c865adaef9abd733abb2fab9f73db0efbdb0cc54b8f5b78bdc7cacbc9cb7e637e2a3; _xsrf=jWERx0Ik6tjUozZKGWIpPBRGFOJ6QYhq; l_cap_id="NWI2N2QwMDM0MjUzNDU4OWExMmE3NmI0Y2I5ZTc3MmQ=|1693290667|022d1fb6013e570378e4fa421ac1e25e984e3165"; r_cap_id="YjY0YWI2YjcyM2QxNGI1Mjg5MTM5ZmRjMGEwYzEwYTg=|1693290667|1fcd27c525bc660ecf654c711ac76b67d452689c"; cap_id="YjU5YjE5MzFjN2ZlNDhlZDhlYWQ0NTE5OTRkZTRjZjU=|1693290667|a118f84fa5d20957be92227edacf0e66d30eeec0"; captcha_session_v2=2|1:0|10:1693292926|18:captcha_session_v2|88:TWFFU1NCVHlldDVJaTR5cTlwM2h4SmhGeTJTZ010WFV5Rm8xVzE3WWpOUjFyL0xkcVI3TjZGeHNxY3FGVmxCVQ==|2ce870f0a811b7f7d08e168a66921c06fe61a12bda683b178a4b602e4752f7a0; gdxidpyhxdE=QGggrpC%2BxZPIYJYBt8R4ujh6KD%5CTpC9W20pZ6YAcDsSM81tdUWJuNon2TBMMS3NC%2BjjbAMgsmIoioR%2BnaJbPnN3TJma2%2B%5C%5CVBm7gS4%5CsviBdQK6%2BolIZbAtHwcEfBz0VRYv6eQ%2FjmU4SrTrwXqesKfBaqvIRyDvr69M1gSgHinN%2FUV1s%3A1693293827600; q_c1=c4dd7565996f498d8689e31708ec9ef1|1693292955000|1693292955000; z_c0=2|1:0|10:1693292957|4:z_c0|92:Mi4xVWdrZUJnQUFBQUFCc0pPNkNadElGeVlBQUFCZ0FsVk5tdWZhWlFEa0pEVnZ5MGRVbmNuQzhDM3ljT0VyVnFUUUtB|924bb27a52a11d16167abbc8c01824e09e82e2df7f3724ceea2b675a569137ad; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1693288624,1693290816,1693292927,1693315711; SESSIONID=7NnIui3CdpkQ2CVVCuillDLNphd1UQs3BxB7AVZiwUy; JOID=VlwQC0nBLspKFqRRHM0YnbfzUXEK9mGpCWXNY1KjXqAWLuEHS0DQICIQpV0bHMfWHsi4i_WxPEPuNtHxDESP0qY=; osd=UF0dC0LHL8dKHaJQEc0Tm7b-UXoM92ypAmPMblKoWKEbLuoBSk3QKyQRqF0QGsbbHsO-ivixN0XvO9H6CkWC0q0=; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1693316313; tst=r; KLBRSID=f48cb29c5180c5b0d91ded2e70103232|1693316989|1693315625',
    'Usrt-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
}
r = requests.get(url=url,headers=headers)
with open('1.html','wb') as f:
    f.write(r.text.encode('utf-8'))
    
    

3.4 request(证书忽略,超时。证书)

新建requests4.py

import requests  # 导入requests库,用于发起HTTP请求  
  
from requests.auth import HTTPBasicAuth  # 从requests库中导入HTTPBasicAuth类,用于HTTP基础认证  
  
# r = requests.get('https://ssr2.scrape.center/')  # 发送GET请求到https://ssr2.scrape.center/, 
  
# print(r.status_code)  # 打印请求返回的HTTP状态码,
  
# r = requests.get('https://ssr2.scrape.center/', verify=False, timeout=0.1)  # 发送GET请求到https://ssr2.scrape.center/, 不验证SSL证书,并设置请求超时时间为0.1秒  
# print(r.status_code)  # 打印请求返回的HTTP状态码,但这行也被注释掉了  
  
# r = requests.get('https://ssr3.scrape.center/', verify=False, auth=HTTPBasicAuth('admin', 'admin'))  # 发送GET请求到https://ssr3.scrape.center/,不验证SSL证书,并使用HTTP基础认证,用户名和密码分别是'admin'  
​
# print(r.text)  # 打印请求返回的文本内容  
  

效果

3.5 request高级特性

新建requestcookiejar.py

import requests.cookies 
​
​
Cookie='_zap=65985310-a068-4c12-ae0a-56251c2c5c12; d_c0=AbCTugmbSBePTrEOSOMV93HuhQPipyoMkyM=|1692789471; YD00517437729195%3AWM_TID=emVDLGILJsBERAVQVAeAkpebh4G4Aa0t; __snaker__id=zptBm6fqrykPGJWm; YD00517437729195%3AWM_NI=SQ6wtpN50b7JklREIGLJWfA7KXvU0ElY78UhdWVg5RLCcXFSmIutvYWSTxuU4CpLkUPWI2Y4mwYdcmBA086%2BVej4kBzqutG6WzywEoor7JT9in6Xt7l1sOIXt%2ByjYphdTVg%3D; YD00517437729195%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee83aa66a1ecfd96eb4b8ea88aa7c44e838b8a87c56297abf990f15cf68e9887d02af0fea7c3b92a918ffa98f77c8eeb0083b642a9b49ea6cc4d90969987c43d8988bab6b34fb087f9d9d864a8899a88b85a909dadb9c559af97bb95f553958d9c99f85ff89dc0adea5f948987d3dc40afa99785e267829f00d9b52196bba6d5ea4abaafbb95c63e95a6b798c865adaef9abd733abb2fab9f73db0efbdb0cc54b8f5b78bdc7cacbc9cb7e637e2a3; _xsrf=jWERx0Ik6tjUozZKGWIpPBRGFOJ6QYhq; l_cap_id="NWI2N2QwMDM0MjUzNDU4OWExMmE3NmI0Y2I5ZTc3MmQ=|1693290667|022d1fb6013e570378e4fa421ac1e25e984e3165"; r_cap_id="YjY0YWI2YjcyM2QxNGI1Mjg5MTM5ZmRjMGEwYzEwYTg=|1693290667|1fcd27c525bc660ecf654c711ac76b67d452689c"; cap_id="YjU5YjE5MzFjN2ZlNDhlZDhlYWQ0NTE5OTRkZTRjZjU=|1693290667|a118f84fa5d20957be92227edacf0e66d30eeec0"; captcha_session_v2=2|1:0|10:1693292926|18:captcha_session_v2|88:TWFFU1NCVHlldDVJaTR5cTlwM2h4SmhGeTJTZ010WFV5Rm8xVzE3WWpOUjFyL0xkcVI3TjZGeHNxY3FGVmxCVQ==|2ce870f0a811b7f7d08e168a66921c06fe61a12bda683b178a4b602e4752f7a0; gdxidpyhxdE=QGggrpC%2BxZPIYJYBt8R4ujh6KD%5CTpC9W20pZ6YAcDsSM81tdUWJuNon2TBMMS3NC%2BjjbAMgsmIoioR%2BnaJbPnN3TJma2%2B%5C%5CVBm7gS4%5CsviBdQK6%2BolIZbAtHwcEfBz0VRYv6eQ%2FjmU4SrTrwXqesKfBaqvIRyDvr69M1gSgHinN%2FUV1s%3A1693293827600; q_c1=c4dd7565996f498d8689e31708ec9ef1|1693292955000|1693292955000; z_c0=2|1:0|10:1693292957|4:z_c0|92:Mi4xVWdrZUJnQUFBQUFCc0pPNkNadElGeVlBQUFCZ0FsVk5tdWZhWlFEa0pEVnZ5MGRVbmNuQzhDM3ljT0VyVnFUUUtB|924bb27a52a11d16167abbc8c01824e09e82e2df7f3724ceea2b675a569137ad; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1693288624,1693290816,1693292927,1693315711; SESSIONID=7NnIui3CdpkQ2CVVCuillDLNphd1UQs3BxB7AVZiwUy; JOID=VlwQC0nBLspKFqRRHM0YnbfzUXEK9mGpCWXNY1KjXqAWLuEHS0DQICIQpV0bHMfWHsi4i_WxPEPuNtHxDESP0qY=; osd=UF0dC0LHL8dKHaJQEc0Tm7b-UXoM92ypAmPMblKoWKEbLuoBSk3QKyQRqF0QGsbbHsO-ivixN0XvO9H6CkWC0q0=; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1693316313; tst=r; KLBRSID=f48cb29c5180c5b0d91ded2e70103232|1693316989|1693315625'
#创建一个空的RequestsCookieJar来保存cookies
jar = requests.cookies.RequestsCookieJar()
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
}
#遍历分割cookies字符串,将每一个cookie的建值对添加到 cookiejar中
for cookie in Cookie.split(';'):
    key,value = cookie.split('=',1)
    # print(key)
    jar.set(key,value)
  
#发送请求并且附带cookies和header    
r = requests.get('http://www.zhihu.com',cookies=jar,headers=headers)
with open('2.html','wb') as f:
    f.write(r.text.encode('utf-8'))    
​

3.6 reqiest_session

python
import requests  # 导入requests库,用于发起HTTP请求  
  
# #1. 创建一个session对象  
# session对象可以跨请求保持某些参数,比如cookies,请求头等  
s = requests.Session()  
  
# #2. 使用session对象向网站发送GET请求并设置cookie  
# 发送GET请求到http://httpbin.org/cookies/set/number/123456,设置cookie的键为'number',值为'123456'  
# 注意:这里设置cookie的操作是由httpbin网站内部处理的,响应中不会直接显示设置的cookie  
s.get('http://httpbin.org/cookies/set/number/123456')  
  
# #3. 使用同一个session对象再次发送GET请求,获取当前会话里的cookie  
# 发送GET请求到http://httpbin.org/cookies,获取当前会话中的所有cookies  
# 由于使用了同一个session对象,它会自动携带之前设置的cookie进行请求  
r = s.get('http://httpbin.org/cookies')  
  
# 打印响应的文本内容,其中包含当前会话的cookies信息  
print(r.text)  
  
​

效果

4 httpx

4.1 httpx模块介绍

httpx模块是Python 3的一个全功能HTTP客户端,它提供了同步和异步API,并支持HTTP/1.1和HTTP/2。该模块建立在requests库的完善可用性之上,不仅继承了requests的大部分功能,而且比后者更加强大和灵活

模块安装

pip install httpx
支持http2.0还需要按照2.0的支持
pip install "httpx[http2]"

新建httpx_test.py

#!/usr/bin/env python
​
import requests
import httpx
​
url = 'https://spa16.scrape.center/'
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76"
}
data={
    "name":"handsome scj"
}
​
client = httpx.Client(http2=True)
response = client.post('https://www.httpbin.org/post',headers=headers,data=data)
​
print(response.text)

效果

5 抓取电影信息

5.1 项目梳理

第一步:遍历所有的页码,拼接URL 第二步:拿到详情页页面的url 第三步:再详情页面用正则匹配出我们要的内容 第四步:保存数据

5.2 logging模块:

用于记录日志,方便调试 日志级别: DEBUG: 用于详细的调试信息,通常用于开发和故障排查。 INFO: 提供一般信息,表明应用程序正在正常运行。 WARNING: 表示潜在的问题或异常情况,但不会中断应用程序。 ERROR: 指示错误发生,可能会导致应用程序部分失败。 CRITICAL: 指示严重错误,可能会导致应用程序完全失败。

5.2.1 logging案例

新建logging_demo.py

#!/usr/bin/env python
​
import logging
​
#配置日志记录器
#第一种方式
​
#level指定记录日志的级别
# logging.basicConfig(level=logging.DEBUG,filename="app.log",
#                     format='%(asctime)s - %(levelname)s - %(message)s')
# loger = logging.getLogger("myapp")
# loger.debug("这是一条debug信息")
# loger.info("这是一条info信息")
# loger.warning("这是一条warning信息")
# loger.error("这是一条error信息")
# loger.critical("这是一条CRITICAL信息")
​
#创建
loger = logging.getLogger("myapp")
loger.setLevel(logging.INFO)
​
#显示在终端上
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
​
#显示到文件里
file_handler = logging.FileHandler("myapp.log")
file_handler.setLevel(logging.ERROR)
​
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
​
loger.addHandler(file_handler)
loger.addHandler(console_handler)
​
loger.info("这是一条info信息")
loger.error("这是一条error信息")

效果

5.3 项目实现1

#!/usr/bin/env python
​
import logging
import requests
import re
from urllib.parse import urljoin
import pymongo
​
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(levelname)s - %(message)s')
​
BASE_URL = 'https://ssr1.scrape.center'
TOTAL_PAGE = 10
​
#抓取某一页面的内容
def scrape_index(page):
    index_url = f'{BASE_URL}/page/{page}'
    return scrape_page(index_url)
​
#定义一个函数抓取网页的内容    
def scrape_page(url):
    logging.info("正在抓取 %s.....",url)
    #发起get请求
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        else:
            logging.error("抓取 %s 时返回无效的状态码 %s",url,response.status_code)
    except requests.RequestException :
        #如果发生异常,就报错
        logging.error("抓取%s时发生异常",url,exc_info=True) 
        
#解析内容,并提取出详情页面的url
def parse_index(html):
    #用正则把连接给提取出来
    # print(type(html))
    pattern = re.compile('<a.*href="(.*?)".*?class="name">')
    items = re.findall(pattern,html)
    # print(items)
    if not items:
        return []
    for item in items:
        #把相对链接转为绝对链接           
        detail_url = urljoin(BASE_URL,item)
        # print(detail_url)
        logging.info('找到详情页面了,链接%s',detail_url)
        yield detail_url
        
def main():
    for page in range(1,TOTAL_PAGE+1):
        index_html = scrape_index(page)
        detail_urls = parse_index(index_html)
        # print(list(detail_urls))
        logging.info('详细页面链接 %s', list(detail_urls))
​
if __name__ == '__main__':
    main()                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/565542.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

究竟该怎么寄快递才能安全无误的送到手中呢?

最近&#xff0c;小编上班了发现有同事在吐槽快递送到手中的时间很晚了&#xff0c;比预计的时间差了很多&#xff0c;并且产品也有不同程度的损坏。这就让我们很是恼火了&#xff0c;但是细细研究后才发现有一部分的原因竟然是我们的原因才导致的寄快递出现了很多纰漏。 首先…

sql(ctfhub)

一.整数型注入 输入1 输入2 输入2-1&#xff0c;回显为1的结果&#xff0c;说明是数字型&#xff0c;只有数字型才可加减 判断字段数为2 查询数据库 查表 查列 显示flag内容 二.字符型注入 输入1 输入2 输入2-1&#xff0c;说明为字符型&#xff0c;不是数字型 判断闭合方式为…

MyBatis 框架学习(I)

MyBatis 框架学习(I) 文章目录 MyBatis 框架学习(I)1. 介绍2. 准备&测试3. MyBatis 注解基础操作3.1 日志输出3.2 Insert 操作3.3 Delete 操作3.4 Update 操作3.5 Select 操作 总结 1. 介绍 之前我们学习过利用JDBC操作数据库进行项目开发&#xff0c;但我们发现它操作起来…

mysql基础19——日志

日志 mysql的日志种类非常多 通用查询日志 慢查询日志 错误日志 与时间有关联 二进制日志 中继日志 与主从服务器的同步有关 重做日志 回滚日志 与数据丢失有关 通用查询日志 记录了所有用户的连接开始时间和截至时间 以及给mysql服务器发送的所有指令 当数据异常时&…

Skill Check: Build an LLM Application using OCI Generative AI Service

Skill Check: Build an LLM Application using OCI Generative AI Service

Oracle21C 引入HR实例(linux)

1、下载资源 https://github.com/oracle-samples/db-sample-schemas点击code&#xff08;代码&#xff09;下载 2、上传Sql文件 解压之后将human_resources里的文件复制到demo\schema\目录&#xff08;具体目录前面的路径是你安装的路径&#xff09;下&#xff0c;如下图 3、…

Zoom会议频繁中断怎么办?解决策略来了

在远程办公盛行的今天&#xff0c;Zoom会议成为众多团队沟通协作的工具。然而&#xff0c;不少用户在使用过程中遇到Zoom会议频繁中断的困扰&#xff0c;这不仅影响工作效率&#xff0c;更可能阻碍信息的及时传递。那么&#xff0c;该如何应对这一问题&#xff0c;确保Zoom会议…

HarmonyOS开发实例:【图片编辑应用】

介绍 本篇Codelab通过动态设置元素样式的方式&#xff0c;实现几种常见的图片操作&#xff0c;包括裁剪、旋转、缩放和镜像。效果如图所示&#xff1a; 相关概念 [image组件]&#xff1a;图片组件&#xff0c;用来渲染展示图片。[div组件]&#xff1a;基础容器组件&#xff0…

wps免登录绕路

打开注册表 regedit 新建字符串值--> false

如何处理Keil uVision5注释无法输入汉字且输入汉字变成问号的问题

好久没用KEIL&#xff0c;今天在注释中出现无法输入汉字的情况&#xff0c;且输入或粘贴的汉字都变成了问号&#xff0c;解决方法很简单&#xff0c;将General Editor Settings: Encoding:设置为Chinese GB2312(Simplified)即可&#xff08;出现问号的当前设置是Encode in ANSI…

OpenHarmony实战开发-文件上传下载性能提升指导。

概述 在开发应用时&#xff0c;要实现高效的客户端跟服务器之间数据交换&#xff0c;文件传输的性能是至关重要的。一个数据交换性能较低的应用会导致其在加载过程中耗费较长时间&#xff0c;在很多的场景造成页面卡顿&#xff0c;极大的影响了用户体验。相反&#xff0c;一个…

使用vite从头搭建一个vue3项目(三)vite.config.js配置

目录 一、声明环境变量配置文件二、vite.config.js基础配置1、defineConfig()、loadEnv()2、plugins配置项3、server配置项4、resolve配置项5、css配置项6、build配置项 三、vite.config.js配置完整代码 VITE版本&#xff1a;v5.2.8 一、声明环境变量配置文件 在根目录下新建…

react 安装教程

1、安装脚手架 脚手架主要分为三个部分&#xff1a; react:顶级库。 react-dom&#xff1a;运行环境。 react-scripts&#xff1a;运行和打包react应用程序的脚本和配置。 npm install -g create-react-app 2、创建项目 #查看版本号 create-react-app -V #创建项目 creat…

李廉洋:4.23黄金休市之后大幅下跌,原油小幅度上涨。走势分析!

今年以来推动金价上涨的因素是亚洲的需求&#xff0c;很可能来自各国央行。最近又有零售买盘和一些金融买盘作为补充。目前的问题是&#xff0c;不断上升的债券收益率正在争夺资金。美国2年期国债的收益率接近5%&#xff0c;在美联储降息导致收益率开始下降之前&#xff0c;这仍…

13.Nacos简介,下载,安装,启动-windows

Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud的一个组件。 相比Eureka功能更加丰富&#xff0c;服务注册与发现和分布式配置。 Nacos下载地址&#xff1a; https://github.com/alibaba/nacos windows下载nacos-server-1.4.1.zip文件 nacos是基于java语言实现的&…

iStat Menus for Mac:强大的系统监控工具

iStat Menus for Mac是一款功能强大的系统监控工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户全面了解电脑的运行状态&#xff0c;提高电脑的性能和稳定性。 iStat Menus for Mac v6.73 (1239)中文版下载 该软件可以实时监测CPU使用率、内存占用、网络速度、硬盘活动…

力扣HOT100 - 25. K 个一组翻转链表

解题思路&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dum new ListNode(0, head);ListNode pre dum;ListNode end dum;while (end.next ! null) {for (int i 0; i < k && end ! null; i) {end end.next;}if …

思科 Packet Tracer 实验八 DHCP基本配置(以路由为中继)

一、实验目的 了解思科网络设备的配置基本特点及 IOS 命令基本操作方法 了解DHCP的工作原理及基本配置 二、实验过程 1) 实验拓扑如下&#xff1a; 2&#xff09;由于使用DHCP‘协议动态配置ip&#xff0c;所以除了DHCP服务器和路由器接口外其他的主机&#xff0c;服务器的i…

Spring之AOP编程

一.静态代理设计模式 1.为什么需要代理设计模式&#xff1f; 在JavaEE开发中&#xff0c;哪个层次最为重要&#xff1f; DAO层->Service层->Controller层。最重要的是Service层 Service层包含了哪些代码&#xff1f; 1.核心功能&#xff1a;业务运算DAO调用 2.额外…

必应搜索广告与谷歌搜索广告对比那个更好?

搜索引擎广告作为企业获取潜在客户的重要渠道之一&#xff0c;其效果直接关系到营销策略的成功与否。两大搜索引擎巨头——谷歌&#xff08;Google&#xff09;和必应&#xff08;Bing&#xff09;各自提供了广告平台&#xff0c;即谷歌广告&#xff08;Google Ads&#xff09;…