• python爬取数据再次出错


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 CSDN_ptt 2024-05-18 23:17 采纳率: 58.3% 浏览 6 首页/ 编程语言 / python爬取数据再次出错 python ```python import pandas as pd import time import requests from lxml import etree import random import string def generate_random_user_agent(): return f'Mozilla/5.0 ({random.choice(["Linux", "Macintosh", "Windows"])}; {random.choice(["U; ", "; "])}{random.choice(["X11", ""])}) AppleWebKit/{random.randint(537, 539)}.36 (KHTML, like Gecko) Chrome/{random.randint(58, 100)}.0.{random.randint(1000, 9999)}.0 Safari/{random.randint(534, 537)}.36' def main(z, key): headers = { 'User-Agent': generate_random_user_agent(), } url = f'http://www.36hjob.com/Job/Search?matchfield=1&soword={key}&Page={z}' print(url) try: response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"Failed to fetch page {url}: {str(e)}") return pd.DataFrame() don = etree.HTML(response.text) jobnames = don.xpath('//*[@id="tblmain"]/tr/td[1]/a/text()') #职位 salary = don.xpath('//*[@id="tblmain"]/tr/td[4]/text()') #工资 place = don.xpath('//*[@id="tblmain"]/tr/td[3]/text()') # 工作地点 place_1 = [i.replace('','none') for i in place] company_name = don.xpath('//*[@id="tblmain"]/tr/td[2]/a/text()') # 公司名称 date = don.xpath('//*[@id="tblmain"]/tr/td[5]/text()') # 招聘日期 href = don.xpath('//*[@id="tblmain"]/tr/td[1]/a/@href') #到对应的网页爬取数据 e1 = [] #工作性质 h1 = [] #专业要求 g1 = [] #学历要求 b1 = [] #年龄要求 t1 = [] #外语要求 m1 = [] #招聘人数 n1 = []# 经验要求 w1 = [] #职称要求 for i in href: rq = requests.get(i,headers = headers) don1 = etree.HTML(rq.text) e = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[1]/td[1]/text()')#工作性质 e1.append(e) h = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[2]/td[1]/text()') #专业要求 h1.append(h) g = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[2]/td[2]/text()') #学历要求 g1.append(g) b = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[4]/td[1]/text()') #年龄要求 b1.append(b) t = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[6]/td[2]/text()') #外语要求 t1.append(t) m = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[7]/td[2]/text()') #招聘人数 m1.append(m) n = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[4]/td[2]/text()') #经验要求 n1.append(n) w = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[3]/td[1]') #职称要求 w1.append(w1) #生成数据框 data = pd.DataFrame({ '职位名称':jobnames, '工作性质':e1, '专业要求':h1, '学历要求':g1, '年龄要求':b1, '外语要求':t1, '职称要求':w1, '招聘人数':m1, '经验要求':n1, '招聘日期':date, '月薪':salary, '工作地点':place_1, '公司名称':company_name }) return data keys = ['C++','大数据','hive','java','hadoop','web','SQL','计算机网络','区块链','数据分析','文员','媒体','摄影','化妆师'] DF = pd.DataFrame() for k in keys: for z in range(1, 40): data = main(z, k) if not data.empty: DF = DF.append(data, ignore_index=True) time.sleep(random.randint(10, 30)) ConnectionError: HTTPConnectionPool(host='water.36hjob.com', port=80): Max retries exceeded with url: /job-GxKVe.html (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 11001] getaddrinfo failed',)) 求指点,再次出现问题 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    5条回答 默认 最新

    • 阿里嘎多学长 2024-05-18 23:17
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      【您想要解决的问题】:您希望解决的问题是Python爬虫在爬取数据时遇到的ConnectionError错误,具体表现为无法建立新的HTTP连接。

      【问题出现原因】:根据错误信息ConnectionError: HTTPConnectionPool(host='water.36hjob.com', port=80): Max retries exceeded with url: /job-GxKVe.html (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 11001] getaddrinfo failed')),问题可能是由于以下原因造成的:

      1. 目标网站water.36hjob.com可能暂时无法访问或域名解析失败。
      2. 网络连接问题,导致无法建立到目标服务器的连接。
      3. 请求的URL可能存在问题,例如路径错误或URL格式不正确。

      【问题解决方案】:

      1. 首先,检查目标网站water.36hjob.com是否能够正常访问。
      2. 确认您的网络连接是稳定的。
      3. 检查href变量中的URL是否正确生成,确保路径和格式无误。
      4. 尝试使用try-except语句捕获异常,并在异常发生时进行重试。
      5. 考虑增加请求的超时时间,或者在请求失败后添加延时重试的逻辑。

      【提供代码】:以下是修改后的代码示例,增加了异常处理和重试逻辑:

      import time
      
      def fetch_job_details(url, headers, retries=3, delay=5):
          for attempt in range(retries):
              try:
                  response = requests.get(url, headers=headers, timeout=10)
                  response.raise_for_status()
                  return response
              except requests.exceptions.RequestException as e:
                  print(f"Failed to fetch {url}, attempt {attempt+1}/{retries}. Retrying in {delay} seconds...")
                  time.sleep(delay)
          return None
      
      # 在主函数中调用fetch_job_details
      for i in href:
          rq = fetch_job_details(i, headers)
          if rq:
              don1 = etree.HTML(rq.text)
              # ... 省略其他代码 ...
      

      【代码运行方式】:运行此代码需要Python环境,安装了requestslxml库。在命令行中运行脚本,或者在IDE中执行。

      【代码预期运行结果】:如果修改后的代码能够成功运行,它将能够处理网络请求异常,并在失败时进行重试,从而提高爬虫的稳定性和成功率。

      【推荐相关链接】:

      请注意,网络爬虫应遵守目标网站的robots.txt文件规定,尊重版权和用户隐私,不要进行任何违法或不道德的行为。

      展开全部

      评论 编辑记录
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-18 23:17
      关注

      引自免费微信小程序:皆我百晓生

      在你的代码中,出现了ConnectionError,这通常是因为网络连接问题或者目标网站服务器暂时不可访问。错误信息提到getaddrinfo failed,这通常是DNS解析失败导致的。为了解决这个问题,可以尝试以下几个步骤:

      1. 确保你的网络连接正常。
      2. 检查目标网站是否可用,可能是因为网站维护或者服务器故障。
      3. 尝试更换DNS服务提供商,或者使用公共DNS(如Google DNS:8.8.8.8 或者 8.8.4.4)。
      4. 在请求头中添加Accept-Encoding: gzip, deflate,有些网站可能因为编码问题导致无法访问。
      5. 使用代理IP进行请求,有时候由于IP被限制可能会遇到此类问题。

      下面是修改后的代码:

      import pandas as pd
      import time
      import requests
      from lxml import etree
      import random
      import string
      
      def generate_random_user_agent():
          return f'Mozilla/5.0 ({random.choice(["Linux", "Macintosh", "Windows"])}; {random.choice(["U; ", "; "])}{random.choice(["X11", ""])}) AppleWebKit/{random.randint(537, 539)}.36 (KHTML, like Gecko) Chrome/{random.randint(58, 100)}.0.{random.randint(1000, 9999)}.0 Safari/{random.randint(534, 537)}.36'
      
      def main(z, key):
          headers = {
              'User-Agent': generate_random_user_agent(),
              'Accept-Encoding': 'gzip, deflate',
          }
      
          url = f'http://www.36hjob.com/Job/Search?matchfield=1&soword={key}&Page={z}'
          print(url)
          
          proxies = {"http": "http://your_proxy_ip:your_proxy_port", "https": "https://your_proxy_ip:your_proxy_port"}  # 替换为你的代理IP和端口
          try:
              response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
              response.raise_for_status()
          except requests.exceptions.RequestException as e:
              print(f"Failed to fetch page {url}: {str(e)}")
              return pd.DataFrame()
      
          don = etree.HTML(response.text)
      
          # ... (剩下的代码保持不变)
      
      keys = ['C++','大数据','hive','java','hadoop','web','SQL','计算机网络','区块链','数据分析','文员','媒体','摄影','化妆师']
      DF = pd.DataFrame()
      for k in keys:
          for z in range(1, 40):
              data = main(z, k)
              if not data.empty:
                  DF = DF.append(data, ignore_index=True)
                  time.sleep(random.randint(10, 30))
      

      确保将上述代码中的your_proxy_ipyour_proxy_port替换为你实际可用的代理IP地址和端口。如果使用了代理,记得遵守相关法律法规,并确保使用的代理是合法的。

      如果问题依然存在,请检查目标网站是否进行了反爬虫策略调整,或者联系网站管理员确认是否有其他限制。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 2024-05-18 23:17
      关注

      晚上好🌙🌙🌙
      本答案参考ChatGPT-3.5

      根据报错信息 ConnectionError: HTTPConnectionPool(host='water.36hjob.com', port=80): Max retries exceeded with url: /job-GxKVe.html (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 11001] getaddrinfo failed',)) 可以看出出现了一个连接错误,那么是什么引起了连接错误呢?

      首先这个错误是由 requests.get 方法引起的,由前面的代码可以看出 requests.get 请求了两个页面,第一个是搜索页面,第二个是搜索结果页面对应详情页面。而在请求详细页面时出现了连接错误。

      出现连接错误有很多原因,包括:

      1.目标主机不可达或者服务不可用;

      2.有些网站在检测到非浏览器的请求时会禁止访问并且返回错误。

      所以我们可以进行以下操作来解决:

      1.检查目标网站是否正常运行,或者在请求过程中发生了什么。

      2.检查 User-Agent 是否包含正确的浏览器信息,如果不包含,则可能会被网站认为是非法请求。

      3.考虑增加延时时间,避免短时间内请求过于频繁。

      修改上述代码需要增加异常处理以便调试:

      # 获取数据列表
      def get_data_list(url, headers):
          try:
              response = requests.get(url, headers=headers, timeout=10)
              response.raise_for_status()
          except requests.exceptions.RequestException as e:
              print(f"Failed to fetch page {url}: {str(e)}")
              return None
      
          don = etree.HTML(response.text)
          data_list = list()
          href_list = don.xpath('//*[@id="tblmain"]/tr/td[1]/a/@href')
          for href in href_list:
              rq = requests.get(href, headers=headers)
              try:
                  rq.raise_for_status()
                  don1 = etree.HTML(rq.text)
                  e = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[1]/td[1]/text()')
                  h = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[2]/td[1]/text()')
                  g = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[2]/td[2]/text()')
                  b = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[4]/td[1]/text()')
                  t = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[6]/td[2]/text()')
                  m = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[7]/td[2]/text()')
                  n = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[4]/td[2]/text()')
                  w = don1.xpath('/html/body/div[4]/div[2]/div[1]/table/tr[3]/td[1]')
                  data = {
                      '工作性质': e[0] if e else '',
                      '专业要求': h[0] if h else '',
                      '学历要求': g[0] if g else '',
                      '年龄要求': b[0] if b else '',
                      '外语要求': t[0] if t else '',
                      '职称要求': w[0] if w else '',
                      '招聘人数': m[0] if m else '',
                      '经验要求': n[0] if n else '',
                  }
                  data_list.append(data)
                  time.sleep(random.randint(10, 30))
              except requests.exceptions.RequestException as e:
                  print(f"Failed to fetch page {href}: {str(e)}")
          return data_list
      
      
      # 获取数据
      def get_data(key, page, headers):
          url = f'http://www.36hjob.com/Job/Search?matchfield=1&soword={key}&Page={page}'
          print(url)
          try:
              response = requests.get(url, headers=headers, timeout=10)
              response.raise_for_status()
          except requests.exceptions.RequestException as e:
              print(f"Failed to fetch page {url}: {str(e)}")
              return None
      
          don = etree.HTML(response.text)
      
          jobnames = don.xpath('//*[@id="tblmain"]/tr/td[1]/a/text()')
          salary = don.xpath('//*[@id="tblmain"]/tr/td[4]/text()')
          place = don.xpath('//*[@id="tblmain"]/tr/td[3]/text()')
          place_1 = [i.replace('', 'none') for i in place]
          company_name = don.xpath('//*[@id="tblmain"]/tr/td[2]/a/text()')
          date = don.xpath('//*[@id="tblmain"]/tr/td[5]/text()')
      
          data_list = get_data_list(url, headers)
      
          data = pd.DataFrame({
              '职位名称': jobnames,
              '招聘日期': date,
              '月薪': salary,
              '工作地点': place_1,
              '公司名称': company_name
          })
      
          if data_list:
              data = pd.concat([data, pd.DataFrame(data_list)], axis=1)
          return data
      

      接下来将 main 方法调整为循环的 get_data 方法即可:

      keys = ['C++', '大数据', 'hive', 'java', 'hadoop', 'web', 'SQL', '计算机网络', '区块链', '数据分析', '文员', '媒体', '摄影', '化妆师']
      df = pd.DataFrame()
      
      headers = {'User-Agent': generate_random_user_agent()}
      
      for key in keys:
          for page in range(1, 40):
              data = get_data(key, page, headers)
              if data is not None:
                  df = df.append(data, ignore_index=True)
              time.sleep(random.randint(10, 30))
      

      展开全部

      评论
    • svygh123 2024-05-19 00:37
      关注

      可能是爬取太频繁,从而触发了网站的反爬机制

      评论 编辑记录
    • cjh4312 2024-05-19 09:37
      关注

      不用想还是请求头的问题,我就纳闷了,就一个简单的爬虫,有必要弄那么多花哨的东西,简简单单的写不好吗?

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    hostname -f与uname -n的返回值可能不同
    Linux程序之可变参数&&选项那些事!
    选择困难?我如何实现可道云KODBOX与KODEXPLORE共存。
    【机器人最短路径规划问题(栅格地图)】基于模拟退火算法求解
    《WEB前端框架开发技术》HTML5响应式旅游景区网站——榆林子州HTML+CSS+JavaScript
    Kylin v10安装DM8数据库
    供应链管理的基本方法
    Oracle的约束
    elementui中form表单的重置方法resetFields,resetFields不生效
    竞赛选题 深度学习 opencv python 实现中国交通标志识别_1
  • 原文地址:https://ask.csdn.net/questions/8105685