鱼C论坛

 找回密码
 立即注册
查看: 2258|回复: 15

[已解决]电影信息爬取

[复制链接]
发表于 2023-5-27 17:37:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 哈岁NB 于 2023-5-27 17:38 编辑

请问大佬们。我这个代码哪里出现错误了呢,
  1. import re
  2. import requests
  3. import logging #打印日志
  4. from urllib.parse import urljoin #进行url拼接

  5. logging.basicConfig(level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')
  6. #当前站点
  7. url = 'https://ssr1.scrape.center'
  8. #爬取的总页数
  9. TOTAL_PAGE = 10

  10. #页面爬取
  11. def scrape_page(url):
  12.     logging.info('scraping %s...',url)
  13.     try:
  14.         response = requests.get(url)
  15.         if response.status_code == 200:
  16.             return response.text
  17.         logging.error('get invalid status code %s while scrape %s',response.status_code,url)
  18.     except requests.RequestException:
  19.         logging.error('error occurred while scraping %s',url,exc_info=True)

  20. #爬取列表页
  21. def scrape_index(page):
  22.     index_url = '{}/page/{}'.format(url,page)
  23.     return scrape_page(index_url)

  24. #页面解析
  25. def parse_index(html):
  26.     #正则表达式对象
  27.     pattern = re.compile('<a .*?href="(.*?)".*?class="name">')
  28.     items = re.findall(pattern,html)
  29.     if not items:
  30.         return None
  31.     for item in items:
  32.         #详情页url拼接
  33.         detail_url = urljoin(url,item)
  34.         logging.info('get detail_url {}'.format(detail_url))
  35.         yield detail_url
  36.         
  37. def main():
  38.     for page in range(1,3):
  39.         index_html = scrape_index(page)
  40.         details_url = parse_index(index_html)
  41.         logging.info('detail url {}'.format(list(details_url)))
  42.         
  43. if __name__ == '__main__':
  44.     main()
复制代码


这是报错信息
最佳答案
2023-5-27 17:56:18
这段代码出现了一个SSL证书验证失败的异常。具体原因是请求的目标网站使用了HTTPS协议,而本地计算机无法验证网站所使用的证书是否可信。

解决方法可以是:

1.禁用证书验证功能(不推荐使用):

在 requests.get() 方法中增加参数 verify=False,即 requests.get(url, verify=False)。

2.安装对应的证书文件:

从浏览器中导出网站的根证书,并将其命名为 "xxx.crt" 格式并保存到本地。

然后,将 "xxx.crt" 文件存放到 Python 安装目录下的 /Lib/site-packages/certifi/cacert.pem 路径下。

最后,在代码中调用 requests.get() 方法时加上参数 verify=True,即 requests.get(url, verify=True)。

注意:第二种方法需要在运行环境中安装 certifi 模块。
SF(ZIZNPF13BU7`J8878MKI.png
`O}VFC3@QM692W(6~_FYD4U.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-27 17:38:58 | 显示全部楼层

试试在代码前面取消全局证书验证,应该就不会抛出前面的 ssl 错误了:

  1. # 全局取消验证证书
  2. import ssl
  3. ssl._create_default_https_context = ssl._create_unverified_context
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-5-27 17:46:24 | 显示全部楼层
Twilight6 发表于 2023-5-27 17:38
试试在代码前面取消全局证书验证,应该就不会抛出前面的 ssl 错误了:

不行,还是报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-27 17:50:18 | 显示全部楼层
response = requests.get(url, verify=False)

  1. import re
  2. import requests
  3. import logging #打印日志
  4. from urllib.parse import urljoin #进行url拼接

  5. logging.basicConfig(level=logging.INFO,format = '%(asctime)s - %(levelname)s: %(message)s')
  6. #当前站点
  7. url = 'https://ssr1.scrape.center'
  8. #爬取的总页数
  9. TOTAL_PAGE = 10

  10. #页面爬取
  11. def scrape_page(url):
  12.     logging.info('scraping %s...',url)
  13.     try:
  14.         response = requests.get(url, verify=False)
  15.         if response.status_code == 200:
  16.             return response.text
  17.         logging.error('get invalid status code %s while scrape %s',response.status_code,url)
  18.     except requests.RequestException:
  19.         logging.error('error occurred while scraping %s',url,exc_info=True)

  20. #爬取列表页
  21. def scrape_index(page):
  22.     index_url = '{}/page/{}'.format(url,page)
  23.     return scrape_page(index_url)

  24. #页面解析
  25. def parse_index(html):
  26.     #正则表达式对象
  27.     pattern = re.compile('<a .*?href="(.*?)".*?class="name">')
  28.     items = re.findall(pattern,html)
  29.     if not items:
  30.         return None
  31.     for item in items:
  32.         #详情页url拼接
  33.         detail_url = urljoin(url,item)
  34.         logging.info('get detail_url {}'.format(detail_url))
  35.         yield detail_url
  36.         
  37. def main():
  38.     for page in range(1,3):
  39.         index_html = scrape_index(page)
  40.         details_url = parse_index(index_html)
  41.         logging.info('detail url {}'.format(list(details_url)))
  42.         
  43. if __name__ == '__main__':
  44.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-27 17:53:56 | 显示全部楼层
isdkz 发表于 2023-5-27 17:50
response = requests.get(url, verify=False)

请问一下这个参数是什么呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-27 17:56:18 | 显示全部楼层    本楼为最佳答案   
这段代码出现了一个SSL证书验证失败的异常。具体原因是请求的目标网站使用了HTTPS协议,而本地计算机无法验证网站所使用的证书是否可信。

解决方法可以是:

1.禁用证书验证功能(不推荐使用):

在 requests.get() 方法中增加参数 verify=False,即 requests.get(url, verify=False)。

2.安装对应的证书文件:

从浏览器中导出网站的根证书,并将其命名为 "xxx.crt" 格式并保存到本地。

然后,将 "xxx.crt" 文件存放到 Python 安装目录下的 /Lib/site-packages/certifi/cacert.pem 路径下。

最后,在代码中调用 requests.get() 方法时加上参数 verify=True,即 requests.get(url, verify=True)。

注意:第二种方法需要在运行环境中安装 certifi 模块。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-27 17:56:55 | 显示全部楼层
哈岁NB 发表于 2023-5-27 17:53
请问一下这个参数是什么呢

取消https证书验证
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-27 18:00:35 | 显示全部楼层
sfqxx 发表于 2023-5-27 17:56
这段代码出现了一个SSL证书验证失败的异常。具体原因是请求的目标网站使用了HTTPS协议,而本地计算机无法验 ...

好的,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-27 18:01:08 | 显示全部楼层
sfqxx 发表于 2023-5-27 17:56
这段代码出现了一个SSL证书验证失败的异常。具体原因是请求的目标网站使用了HTTPS协议,而本地计算机无法验 ...

好的,感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-27 18:02:00 | 显示全部楼层

不客气
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-27 18:05:39 | 显示全部楼层

请问一下,为什么有的网站报这个错,而有的不报,是因为有的网站可以识别该网站的ssl证书,所以不报错吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-27 18:09:00 | 显示全部楼层

你个老六
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-27 18:16:33 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-27 18:20:09 | 显示全部楼层
哈岁NB 发表于 2023-5-27 18:05
请问一下,为什么有的网站报这个错,而有的不报,是因为有的网站可以识别该网站的ssl证书,所以不报错吗

这是一个关于SSL证书的问题。SSL证书是用于加密和保护传输数据的数字证书。当浏览器访问网站时,如果该网站有 SSL 证书,则会将该证书下载到浏览器,并与服务器进行验证。如果证书不被承认或不兼容,则浏览器将提示错误。

因此,如果有些网站没有安装 SSL 证书,或者证书已过期或无法正常验证,那么浏览器将会提示错误。而对于安装了有效的 SSL 证书并且正确配置的网站,则不会产生任何警告。

如果您遇到SSL证书相关问题,可以尝试清除浏览器缓存和Cookie,更新浏览器版本或尝试使用其他浏览器等解决方法。同时,也需要确认所访问的网站是否为安全可信的网站,以避免遭受网络攻击和信息泄露。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-27 18:24:19 | 显示全部楼层
sfqxx 发表于 2023-5-27 18:20
这是一个关于SSL证书的问题。SSL证书是用于加密和保护传输数据的数字证书。当浏览器访问网站时,如果该网 ...

明白了,感谢感谢

点评

我很赞同!: 5.0
我很赞同!: 5
不客气  发表于 2023-5-27 18:26
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 21:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表