楼主: Imasasor
2166 7

[问答] 现金悬赏,帮忙爬一个网站表格数据 [推广有奖]

  • 1关注
  • 64粉丝

VIP

学科带头人

34%

还不是VIP/贵宾

-

TA的文库  其他...

超哥喜欢的文章

威望
1
论坛币
47033 个
通用积分
3.1376
学术水平
238 点
热心指数
246 点
信用等级
231 点
经验
36380 点
帖子
866
精华
3
在线时间
2234 小时
注册时间
2012-7-4
最后登录
2023-9-20

初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章

1800论坛币
求高手帮忙用python,最好别用scrapy,用request+lxml或其它爬取一个网站空气质量数据。https://www.aqistudy.cn/historydata/daydata.php?city=%E6%88%90%E9%83%BD&month=201709。
该网页只能用chrome打开,其它网站打不开,而且chrome打开源码中没有想要的数据,不知道怎么办。
程序写的好的话加我好友,我再给100元红包答谢,非常感谢。





最佳答案

gjinwei 查看完整内容

我大致贴个代码,具体的自己去完善吧(列名,城市循环、月份循环),数据我现在直接导出到excel中了,也可以直接入库,调df.to_sql就可以了,不过要加引擎(form sqlalchemy import create_engine engine=create_engine(url)) from selenium import webdriver import pandas as pd dr = webdriver.Chrome() dr.get('https://www.aqistudy.cn/historydata/daydata.php?city=%E6%88%90%E9%83%BD&month=201709') trs =[] for ...
关键词:表格数据 History Request Chrome scrapy
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;
沙发
gjinwei 发表于 2017-10-30 19:16:51 |只看作者 |坛友微信交流群
我大致贴个代码,具体的自己去完善吧(列名,城市循环、月份循环),数据我现在直接导出到excel中了,也可以直接入库,调df.to_sql就可以了,不过要加引擎(form sqlalchemy import create_engine engine=create_engine(url))
from selenium import webdriver
import pandas as pd
dr = webdriver.Chrome()

dr.get('https://www.aqistudy.cn/historydata/daydata.php?city=%E6%88%90%E9%83%BD&month=201709')

trs =[]
for tr in dr.find_elements_by_css_selector('tr')[1:]:
    tds=[]
    for td in tr.find_elements_by_css_selector('td'):
        tds.append(td.text)
    trs.append(tds)
df = pd.DataFrame(trs)
df.to_csv('201709_成都.csv')
附上效果
QQ截图20171031230619.png
QQ截图20171031230455.png
已有 1 人评分经验 收起 理由
残阳_等待 + 60 精彩帖子

总评分: 经验 + 60   查看全部评分

使用道具

藤椅
fengxingliulizi 发表于 2017-10-31 14:37:30 |只看作者 |坛友微信交流群
我看了一下,没搞出来,如果楼主搞出来的,跟我说说。说三种解决方案
1、用selenium
2、换网站
3、用itchat通过微信公众号调
已有 1 人评分经验 收起 理由
残阳_等待 + 20 精彩帖子

总评分: 经验 + 20   查看全部评分

使用道具

板凳
deem 学生认证  发表于 2017-11-1 11:52:17 |只看作者 |坛友微信交流群
gjinwei 发表于 2017-10-31 23:07
我大致贴个代码,具体的自己去完善吧(列名,城市循环、月份循环),数据我现在直接导出到excel中了,也可以 ...
厉害啊 学习了

使用道具

报纸
deem 学生认证  发表于 2017-11-1 13:31:47 |只看作者 |坛友微信交流群
@gjinwei 的代码已经很好了,但是在爬大量网页时候应该用PhantomJS作为模拟浏览器。另外,我做了一点修改,能爬取多个城市多年的数据。楼主需要做的准备工作是配置好PhantomJS和selenium。

  1. # -*- coding: utf-8 -*-

  2. from selenium import webdriver
  3. import pandas as pd
  4. from urllib.parse import quote

  5. city = ['成都', '杭州']
  6. city_encode = [quote(i) for i in city]

  7. # dr = webdriver.Chrome()
  8. df = pd.DataFrame()
  9. dr = webdriver.PhantomJS('/Applications/phantomjs/bin/phantomjs')
  10. file_list = [str(year) + '{:0>2d}'.format(mon) for mon in range(1, 10) for year in range(2016, 2018)]

  11. for i in range(len(city)):
  12.     for file in file_list:
  13.         dr.get('https://www.aqistudy.cn/historydata/daydata.php?city=' + city_encode[i]+ '&month=' + file)
  14.         trs =[]
  15.         for tr in dr.find_elements_by_css_selector('tr')[1:]:
  16.             tds=[]
  17.             for td in tr.find_elements_by_css_selector('td'):
  18.                 tds.append(td.text)
  19.             trs.append(tds)
  20.         temp_df = pd.DataFrame(trs)
  21.         temp_df['city'] = city[i]
  22.         df = df.append(temp_df)
复制代码



已有 1 人评分经验 收起 理由
残阳_等待 + 60 精彩帖子

总评分: 经验 + 60   查看全部评分

使用道具

地板
zjxplq 发表于 2017-11-1 16:00:30 |只看作者 |坛友微信交流群
用excel 2016中的数据查询,很方便搞定,只是一个网页要点几下
已有 1 人评分经验 收起 理由
残阳_等待 + 20 精彩帖子

总评分: 经验 + 20   查看全部评分

使用道具

7
gjinwei 发表于 2017-11-2 10:31:13 |只看作者 |坛友微信交流群
给个可用的版本,用了多线程,但要加载js,效率不高,解析时cpu占用比较高,线程数要根据自己的电脑来控制。用phantomjs也快不了多少,有兴趣可以尝试下。
  1. # -*- coding:UTF-8 -*-
  2. from threading import Thread
  3. from queue import Queue
  4. from datetime import datetime
  5. from sqlalchemy import create_engine,String,Integer,DATE
  6. from selenium import webdriver
  7. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  8. import pandas as pd
  9. import time

  10. engine = create_engine('sqlite:///PM25.db')

  11. cities = ["北京", "上海", "天津", "重庆", "杭州", "哈尔滨", "长春", "沈阳", "石家庄", "太原", "西安", "济南", "乌鲁木齐", "拉萨", "西宁", "兰州", "银川", "郑州",
  12.          "南京", "武汉", "合肥", "福州", "南昌", "长沙", "贵阳", "成都", "广州", "昆明", "南宁", "深圳"]
  13. columns =['日期','AQI','质量等级','PM2.5','PM10','SO2','CO','NO2','O3_8h']
  14. dtypes={
  15.     "日期":String(12),
  16.     "AQI":Integer,
  17.     "质量等级":String(10),
  18.     "PM2.5":Integer,
  19.     "PM10":Integer,
  20.     "SO2":Integer,
  21.     "CO":Integer,
  22.     "NO2":Integer,
  23.     'O3_8h':Integer
  24. }


  25. def prepare_month(start,end,fmt='%Y%m'):
  26.     date_range = pd.date_range(start=start,end=end,freq='M')
  27.     months = [datetime.strftime(date, fmt) for date in date_range]
  28.     return months


  29. def get_data(tasks):
  30.     # For chrome
  31.     chrome_options = webdriver.ChromeOptions()
  32.     chrome_options.add_experimental_option("prefs",{"profile.managed_default_content_settings.images":2})
  33.     dr = webdriver.Chrome(chrome_options=chrome_options)

  34.     # # For phantomjs

  35.     # dcap = dict(DesiredCapabilities.PHANTOMJS)
  36.     # dcap['phantomjs.page.settings.loadImages']=False
  37.     # dr=webdriver.PhantomJS(desired_capabilities=dcap)

  38.     while not tasks.empty():
  39.         city,month = tasks.get()
  40.         dr.get('https://www.aqistudy.cn/historydata/daydata.php?city={0}&month={1}'.format(city, month))
  41.         time.sleep(2)
  42.         trs = []
  43.         for tr in dr.find_elements_by_css_selector('tr')[1:]:
  44.             tds = []
  45.             for td in tr.find_elements_by_css_selector('td'):
  46.                 tds.append(td.text)
  47.             trs.append(tds)
  48.         df = pd.DataFrame(trs,columns=columns)
  49.         df['city']=city
  50.         df.to_sql("jiance", engine, if_exists='append', index=False,dtype=dtypes)
  51.     dr.quit()

  52. if __name__ == '__main__':
  53.     threads=[]
  54.     tasks=Queue()
  55.     months=prepare_month(start='2013-12-1',end='2017-11-1')
  56.     for city in cities:
  57.         for month in months:
  58.             tasks.put((city,month))
  59.     for i in range(5):
  60.         thread=Thread(target=get_data,args=(tasks,))
  61.         threads.append(thread)
  62.         thread.start()
  63.     for thread in threads:
  64.         thread.join()
复制代码


已有 2 人评分经验 论坛币 收起 理由
残阳_等待 + 60 精彩帖子
deem + 5 精彩帖子

总评分: 经验 + 60  论坛币 + 5   查看全部评分

使用道具

8
dsjdsj 发表于 2017-11-16 21:59:59 |只看作者 |坛友微信交流群
感谢藤椅的分享!!!
已有 1 人评分经验 收起 理由
残阳_等待 + 20 精彩帖子

总评分: 经验 + 20   查看全部评分

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-3 18:25