鱼C论坛

 找回密码
 立即注册
查看: 2136|回复: 16

[已解决]紧急!!抓取一个网页的数据并且写入到Excel里 需要用到什么库和函数知识

[复制链接]
发表于 2020-7-6 09:35:01 | 显示全部楼层 |阅读模式

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

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

x
RT  我需要抓紧一个网页的一部分数据,并把这部分数据写入到Excel里,想请教一下大家,需要用到什么库和函数知识。
需要抓取的网页为前程无忧    抓取的数据为公司名  
网址如下:https://search.51job.com/list/030700,000000,0000,00,9,06%252C07%252C08%252C09%252C10,%2B,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=

如图:
1593999174(1).jpg

我要把这些公司名字都写入到Excel里   
请问需要怎么做呢   谢谢

最佳答案
2020-7-6 21:08:10
3个库:requests,lxml,openpyxl

  1. import requests
  2. from lxml import etree
  3. from openpyxl import Workbook


  4. def main():
  5.     url = 'https://search.51job.com/list/030700,000000,0000,00,9,06%252C07%252C08%252C09%252C10,%2B,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
  6.     headers = {'user-agent': 'firefox'}
  7.     r = requests.get(url, headers=headers)
  8.     r.encoding = 'gbk'
  9.     # with open('r.txt', 'w') as f:
  10.     #     f.write(r.text)
  11.     html = etree.HTML(r.text)
  12.     result = html.xpath('//span[@class="t2"]/a[@target="_blank"]/@title')
  13.     wb = Workbook()
  14.     ws = wb.active
  15.     for n, v in enumerate(result):
  16.         ws.cell(row=n+1, column=1, value=v)
  17.     wb.save('job51.xlsx')


  18. if __name__ == '__main__':
  19.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-6 17:08:00 | 显示全部楼层

回帖奖励 +1 鱼币

本帖最后由 comeheres 于 2020-7-6 17:09 编辑

这种简单的数据,直接利用Chrome浏览器插件Instant Data Scraper,不要一分钟就能抓上千条

Snipaste_2020-07-06_16-59-59.png

最新的0.2.3版本(Chrome浏览器打开chrome://extensions/,右上角打开开发者模式,将crx文件拖入浏览器窗口即可安装;新版Edge浏览器也可安装):
解压后得到crx文件再使用.rar (612.78 KB, 下载次数: 9)

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
inver11 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

发表于 2020-7-6 18:11:23 | 显示全部楼层
comeheres 发表于 2020-7-6 17:08
这种简单的数据,直接利用Chrome浏览器插件Instant Data Scraper,不要一分钟就能抓上千条

感谢,我一直在用Web Scraper爬数据,用起来还可以,也可以进行跳页面爬,这个好像没有Web Scraper功能多,不过真的快多了,我再研究研究
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 21:08:10 | 显示全部楼层    本楼为最佳答案   
3个库:requests,lxml,openpyxl

  1. import requests
  2. from lxml import etree
  3. from openpyxl import Workbook


  4. def main():
  5.     url = 'https://search.51job.com/list/030700,000000,0000,00,9,06%252C07%252C08%252C09%252C10,%2B,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
  6.     headers = {'user-agent': 'firefox'}
  7.     r = requests.get(url, headers=headers)
  8.     r.encoding = 'gbk'
  9.     # with open('r.txt', 'w') as f:
  10.     #     f.write(r.text)
  11.     html = etree.HTML(r.text)
  12.     result = html.xpath('//span[@class="t2"]/a[@target="_blank"]/@title')
  13.     wb = Workbook()
  14.     ws = wb.active
  15.     for n, v in enumerate(result):
  16.         ws.cell(row=n+1, column=1, value=v)
  17.     wb.save('job51.xlsx')


  18. if __name__ == '__main__':
  19.     main()
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
inver11 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-7-7 16:04:56 | 显示全部楼层
comeheres 发表于 2020-7-6 17:08
这种简单的数据,直接利用Chrome浏览器插件Instant Data Scraper,不要一分钟就能抓上千条

谢谢  插件很好用 非常感谢
但是好像只能抓取单页,不能自动抓取之后的页面吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 17:44:38 | 显示全部楼层
suchocolate 发表于 2020-7-6 21:08
3个库:requests,lxml,openpyxl

谢谢  我稍微修改了一点  现在可以录入200页的资料了
  1. import requests
  2. from lxml import etree
  3. from openpyxl import Workbook


  4. def main():
  5.     row_1 = 0
  6.     wb = Workbook()
  7.     ws = wb.active
  8.     for num in range(1,201):
  9.         url = 'https://search.51job.com/list/030700,000000,0000,00,9,05%252C06%252C07%252C08%252C09,%2B,2,'+str(num)+'.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='

  10.         #IP代理伪装
  11.         proxies = {"url":'http://115.221.242.206:9999'}

  12.         #浏览器伪装
  13.         headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
  14.         r = requests.get(url, headers=headers, proxies = proxies)
  15.         r.encoding = 'gbk'
  16.         html = etree.HTML(r.text)
  17.         result = html.xpath('//span[@class="t2"]/a[@target="_blank"]/@title')
  18.         for n, v in enumerate(result):
  19.             ws.cell(row=row_1+1, column=1, value=v)
  20.             row_1 += 1
  21.         wb.save('job51.xlsx')


  22. if __name__ == '__main__':
  23.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 18:16:51 | 显示全部楼层
inver11 发表于 2020-7-7 17:44
谢谢  我稍微修改了一点  现在可以录入200页的资料了

大佬,你的个性签名是怎么弄上颜色的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 18:40:31 | 显示全部楼层
  1. [b][color=Red]人生苦短,我用Python[/color][/b]
复制代码

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

使用道具 举报

 楼主| 发表于 2020-7-7 18:42:02 | 显示全部楼层
本帖最后由 inver11 于 2020-7-7 18:47 编辑
suchocolate 发表于 2020-7-6 21:08
3个库:requests,lxml,openpyxl


大佬 可以加个VX或者企鹅吗   
想再请教一下问题   
1.因为目前抓到的客户名字有可能是简称,我还需要再进入下一级链接,去识别客户的真正名称。但是我对HTML的字段识别不是很懂
2.职位的名字和薪酬可以写到同一个单元格里吗     跟客户名保存在同一个文件里吗      表格文件有两列  第一列是客户名  第二例是职位名字和薪酬

想请大佬指导一下思路   

后续可能还想增加一些功能,比如保存下来的文件,根据客户名称自动上网搜索客户的联系方式并保存。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 18:54:31 | 显示全部楼层
inver11 发表于 2020-7-7 16:04
谢谢  插件很好用 非常感谢
但是好像只能抓取单页,不能自动抓取之后的页面吗?

开启之前,要先定位下一页的按钮位置
插件打开后,有个Locate"Next"button按钮,点一下后,再去网页上的下一页按钮再点一下即可
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 19:07:55 | 显示全部楼层
本帖最后由 inver11 于 2020-7-7 19:11 编辑
comeheres 发表于 2020-7-7 18:54
开启之前,要先定位下一页的按钮位置
插件打开后,有个Locate"Next"button按钮,点一下后,再去网页上的 ...


试过了这个,但是只能抓取到第二页的数据就停止了  我截个图给你看看
1594120250(1).jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 20:11:04 | 显示全部楼层
inver11 发表于 2020-7-7 18:42
大佬 可以加个VX或者企鹅吗   
想再请教一下问题   
1.因为目前抓到的客户名字有可能是简称,我还需 ...


  1. import requests
  2. from lxml import etree
  3. from openpyxl import Workbook


  4. def main():
  5.     row = 1
  6.     wb = Workbook()
  7.     ws = wb.active
  8.     for num in range(1, 5):
  9.         url = 'https://search.51job.com/list/030700,000000,0000,00,9,05%252C06%252C07%252C08%252C09,%2B,2,' + str(
  10.             num) + '.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
  11.         # IP代理伪装
  12.         proxies = {"url": 'http://115.221.242.206:9999'}
  13.         # 浏览器伪装
  14.         headers = {
  15.             "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
  16.         r = requests.get(url, headers=headers, proxies=proxies)
  17.         r.encoding = 'gbk'
  18.         html = etree.HTML(r.text)
  19.         result = html.xpath('//div[(@class="el") and not(@id)]')
  20.         for item in result:
  21.             # 公司
  22.             cpy = item.xpath('./span[@class="t2"]/a/@title')[0]
  23.             ws.cell(row=row, column=1, value=cpy)
  24.             # 月薪
  25.             sly = item.xpath('./span[@class="t4"]/text()')
  26.             if sly:
  27.                 ws.cell(row=row, column=2, value=sly[0])
  28.             # 职位
  29.             pos = item.xpath('./p/span/a/@title')[0]
  30.             ws.cell(row=row, column=3, value=pos)
  31.             row = row + 1
  32.     wb.save('job51.xlsx')


  33. if __name__ == '__main__':
  34.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-8 09:21:28 | 显示全部楼层
本帖最后由 inver11 于 2020-7-8 10:55 编辑


请问大佬这一句中的 and not(@id)  是啥意思   我百度了好久也没看懂呢
  1. result = html.xpath('//div[(@class="el") and not(@id)]')
复制代码


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

使用道具 举报

发表于 2020-7-8 09:59:23 | 显示全部楼层
inver11 发表于 2020-7-8 09:21
请问大佬这一句中的 and not(@id)  是啥意思   我百度了好久也没看懂呢

选择class为el,但不能有id属性的div节点。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-8 10:54:40 | 显示全部楼层
suchocolate 发表于 2020-7-8 09:59
选择class为el,但不能有id属性的div节点。

明白了 谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-8 10:55:19 | 显示全部楼层

我修改了一下   增加了进入具体公司信息页面获取客户营业执照名字  因为第一次进入的页面获取的公司名字有可能是品牌名


  1. import requests
  2. from lxml import etree
  3. from openpyxl import Workbook

  4. def test(url_test):
  5.     #获取营业执照名字
  6.     proxies = {"url": 'http://115.221.242.206:9999'}
  7.     headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
  8.     r_test = requests.get(url_test, headers=headers, proxies=proxies)
  9.     r_test.encoding = 'gbk'
  10.     html = etree.HTML(r_test.text)
  11.     try:
  12.         result_test = html.xpath('//span[@class="icon_det"]/@title')
  13.         if result_test:
  14.             result_test = result_test[0][5:]
  15.         else:
  16.             result_test = html.xpath('//h1/@title')
  17.             result_test = result_test[0]
  18.     except IndexError:
  19.         result_test = html.xpath('//head/title/text()')
  20.         len_1=len(str(result_test[0]))-3
  21.         result_test = result_test[0][:len_1]
  22.     return result_test

  23. def main():
  24.     row = 1
  25.     wb = Workbook()
  26.     ws = wb.active
  27.     for num in range(1, 3):
  28.         url = 'https://search.51job.com/list/030700,000000,0000,00,9,05%252C06%252C07%252C08%252C09,%2B,2,' + str(
  29.             num) + '.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
  30.         # IP代理伪装
  31.         proxies = {"url": 'http://115.221.242.206:9999'}
  32.         # 浏览器伪装
  33.         headers = {
  34.             "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
  35.         r = requests.get(url, headers=headers, proxies=proxies)
  36.         r.encoding = 'gbk'
  37.         html = etree.HTML(r.text)
  38.         result = html.xpath('//div[(@class="el") and not(@id)]')
  39.         for item in result:
  40.             # 公司
  41.             cpy_url = item.xpath('./span[@class="t2"]/a/@href')[0]
  42.             print(cpy_url)
  43.             cpy = test(cpy_url)
  44.             ws.cell(row=row, column=1, value=cpy)
  45.             # 月薪
  46.             sly = item.xpath('./span[@class="t4"]/text()')
  47.             if sly:
  48.                 ws.cell(row=row, column=2, value=sly[0])
  49.             # 职位
  50.             pos = item.xpath('./p/span/a/@title')[0]
  51.             ws.cell(row=row, column=3, value=pos)
  52.             row = row + 1
  53.     wb.save('job_51_2.xlsx')


  54. if __name__ == '__main__':
  55.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-8 11:59:26 | 显示全部楼层


增加了两个函数
查询客户营业执照名字
获取总页码
成功爬取了数据,但是有个问题,就是速度太慢了
  1. import requests
  2. from lxml import etree
  3. from openpyxl import Workbook

  4. #####################获取当前最新总页码######################
  5. def num_1():
  6.     url = 'https://search.51job.com/list/030700,000000,0000,00,9,06%252C07%252C08%252C09%252C10,%2B,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
  7.     headers = {'user-agent': 'firefox'}
  8.     r = requests.get(url, headers=headers)
  9.     r.encoding = 'gbk'
  10.     html = etree.HTML(r.text)
  11.     result = html.xpath('//div[@class="p_in"]/input[@type="hidden"]/@value')
  12.     return result[0]



  13. #######################获取营业执照名字####################
  14. def test(url_test):
  15.     proxies = {"url": 'http://115.221.242.206:9999'}
  16.     headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
  17.     r_test = requests.get(url_test, headers=headers, proxies=proxies)
  18.     r_test.encoding = 'gbk'
  19.     html = etree.HTML(r_test.text)
  20.     try:
  21.         result_test = html.xpath('//span[@class="icon_det"]/@title')
  22.         if result_test:
  23.             result_test = result_test[0][5:]
  24.         else:
  25.             result_test = html.xpath('//h1/@title')
  26.             result_test = result_test[0]
  27.     except IndexError:
  28.         result_test = html.xpath('//head/title/text()')
  29.         len_1=len(str(result_test[0]))-3
  30.         result_test = result_test[0][:len_1]
  31.     return result_test

  32. def main():
  33.     row = 1
  34.     wb = Workbook()
  35.     ws = wb.active
  36.     num_2 = int(num_1())+1
  37.     for num in range(1,num_2):
  38.         url = 'https://search.51job.com/list/030700,000000,0000,00,9,05%252C06%252C07%252C08%252C09,%2B,2,' + str(
  39.             num) + '.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
  40.         # IP代理伪装
  41.         proxies = {"url": 'http://115.221.242.206:9999'}
  42.         # 浏览器伪装
  43.         headers = {
  44.             "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
  45.         r = requests.get(url, headers=headers, proxies=proxies)
  46.         r.encoding = 'gbk'
  47.         html = etree.HTML(r.text)
  48.         result = html.xpath('//div[(@class="el") and not(@id)]')
  49.         for item in result:
  50.             # 公司
  51.             cpy_url = item.xpath('./span[@class="t2"]/a/@href')[0]
  52.             cpy = test(cpy_url)
  53.             ws.cell(row=row, column=1, value=cpy)
  54.             # 月薪
  55.             sly = item.xpath('./span[@class="t4"]/text()')
  56.             if sly:
  57.                 ws.cell(row=row, column=2, value=sly[0])
  58.             # 职位
  59.             pos = item.xpath('./p/span/a/@title')[0]
  60.             ws.cell(row=row, column=3, value=pos)
  61.             row = row + 1
  62.     wb.save('job_51_2.xlsx')


  63. if __name__ == '__main__':
  64.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 05:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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