使用Python进行Web抓取

时间:2010-01-17 16:06:54

标签: python screen-scraping

我想从网站上获取每日日出/日落时间。是否可以使用Python抓取Web内容?使用的模块是什么?有没有可用的教程?

13 个答案:

答案 0 :(得分:185)

将urllib2与辉煌的BeautifulSoup库结合使用:

import urllib2
from BeautifulSoup import BeautifulSoup
# or if you're using BeautifulSoup4:
# from bs4 import BeautifulSoup

soup = BeautifulSoup(urllib2.urlopen('http://example.com').read())

for row in soup('table', {'class': 'spad'})[0].tbody('tr'):
    tds = row('td')
    print tds[0].string, tds[1].string
    # will print date and sunrise

答案 1 :(得分:59)

我真的推荐Scrapy。

从已删除的答案中引用:

  
      
  • Scrapy爬行比机械化更快,因为使用异步操作(在Twisted之上)。
  •   
  • Scrapy对在libxml2之上解析(x)html提供了更好,最快的支持。
  •   
  • Scrapy是一个成熟的框架,具有完整的unicode,处理重定向,gzipped响应,奇数编码,集成的http缓存等。
  •   
  • 进入Scrapy后,您可以在不到5分钟的时间内编写蜘蛛,下载图像,创建缩略图并将提取的数据直接导出到csv或json。
  •   

答案 2 :(得分:16)

我将来自网络抓取工作的脚本收集到此bit-bucket library

您案例的示例脚本:

from webscraping import download, xpath
D = download.Download()

html = D.get('http://example.com')
for row in xpath.search(html, '//table[@class="spad"]/tbody/tr'):
    cols = xpath.search(row, '/td')
    print 'Sunrise: %s, Sunset: %s' % (cols[1], cols[2])

输出:

Sunrise: 08:39, Sunset: 16:08
Sunrise: 08:39, Sunset: 16:09
Sunrise: 08:39, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:11
Sunrise: 08:40, Sunset: 16:12
Sunrise: 08:40, Sunset: 16:13

答案 3 :(得分:10)

我强烈建议您查看pyquery。它使用类似jquery(也称为css)的语法,这使得那些来自那个背景的人很容易。

对于你的情况,它会是这样的:

from pyquery import *

html = PyQuery(url='http://www.example.com/')
trs = html('table.spad tbody tr')

for tr in trs:
  tds = tr.getchildren()
  print tds[1].text, tds[2].text

输出:

5:16 AM 9:28 PM
5:15 AM 9:30 PM
5:13 AM 9:31 PM
5:12 AM 9:33 PM
5:11 AM 9:34 PM
5:10 AM 9:35 PM
5:09 AM 9:37 PM

答案 4 :(得分:7)

您可以使用urllib2发出HTTP请求,然后您将拥有网络内容。

你可以这样:

import urllib2
response = urllib2.urlopen('http://example.com')
html = response.read()

Beautiful Soup是一个python HTML解析器,应该适合屏幕抓取。

特别是,here是他们解析HTML文档的教程。

祝你好运!

答案 5 :(得分:4)

我使用Scrapemark(查找网址 - py2)和httlib2(下载图片 - py2 + 3)的组合。 scrapemark.py有500行代码,但是使用正则表达式,所以可能没那么快,没有测试。

抓取您网站的示例:

import sys
from pprint import pprint
from scrapemark import scrape

pprint(scrape("""
    <table class="spad">
        <tbody>
            {*
                <tr>
                    <td>{{[].day}}</td>
                    <td>{{[].sunrise}}</td>
                    <td>{{[].sunset}}</td>
                    {# ... #}
                </tr>
            *}
        </tbody>
    </table>
""", url=sys.argv[1] ))

用法:

python2 sunscraper.py http://www.example.com/

结果:

[{'day': u'1. Dez 2012', 'sunrise': u'08:18', 'sunset': u'16:10'},
 {'day': u'2. Dez 2012', 'sunrise': u'08:19', 'sunset': u'16:10'},
 {'day': u'3. Dez 2012', 'sunrise': u'08:21', 'sunset': u'16:09'},
 {'day': u'4. Dez 2012', 'sunrise': u'08:22', 'sunset': u'16:09'},
 {'day': u'5. Dez 2012', 'sunrise': u'08:23', 'sunset': u'16:08'},
 {'day': u'6. Dez 2012', 'sunrise': u'08:25', 'sunset': u'16:08'},
 {'day': u'7. Dez 2012', 'sunrise': u'08:26', 'sunset': u'16:07'}]

答案 6 :(得分:2)

我刚看到RoboBrowser中的Pycoder's Weekly

  

基于Requests和BeautifulSoup构建的网页抓取库。和Mechanize一样,但是有测试,文档和Pythonic接口。

答案 7 :(得分:2)

Scrapy开源框架将有助于python中的web废料。这个开源和协作框架用于从网站中提取所需的数据。

Web抓取与Web索引密切相关,Web索引使用机器人或Web爬虫对Web上的信息进行索引,是大多数搜索引擎采用的通用技术。

More About Web Scraping

答案 8 :(得分:1)

使用CSS Selectors

让您的生活更轻松

我知道我来晚会很晚,但我有一个很好的建议。

已经建议使用BeautifulSoup我宁愿使用CSS Selectors来抓取HTML中的数据

import urllib2
from bs4 import BeautifulSoup

main_url = "http://www.example.com"

main_page_html  = tryAgain(main_url)
main_page_soup = BeautifulSoup(main_page_html)

# Scrape all TDs from TRs inside Table
for tr in main_page_soup.select("table.class_of_table"):
   for td in tr.select("td#id"):
       print(td.text)
       # For acnhors inside TD
       print(td.select("a")[0].text)
       # Value of Href attribute
       print(td.select("a")[0]["href"])

# This is method that scrape URL and if it doesnt get scraped, waits for 20 seconds and then tries again. (I use it because my internet connection sometimes get disconnects)
def tryAgain(passed_url):
    try:
        page  = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
        return page
    except Exception:
        while 1:
            print("Trying again the URL:")
            print(passed_url)
            try:
                page  = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
                print("-------------------------------------")
                print("---- URL was successfully scraped ---")
                print("-------------------------------------")
                return page
            except Exception:
                time.sleep(20)
                continue 

答案 9 :(得分:0)

这是一个简单的网络爬虫,我使用了BeautifulSoup,我们将搜索所有类名为_3NFO0d的链接(锚点)。我使用Flipkar.com,它是一家在线零售商店。

import requests
from bs4 import BeautifulSoup
def crawl_flipkart():
    url = 'https://www.flipkart.com/'
    source_code = requests.get(url)
    plain_text = source_code.text
    soup = BeautifulSoup(plain_text, "lxml")
    for link in soup.findAll('a', {'class': '_3NFO0d'}):
        href = link.get('href')
        print(href)

crawl_flipkart()

答案 10 :(得分:0)

如果我们考虑从任何特定类别获取项目的名称,那么我们可以通过使用css选择器指定该类别的类名来实现:

import requests ; from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get('https://www.flipkart.com/').text, "lxml")
for link in soup.select('div._2kSfQ4'):
    print(link.text)

这是部分搜索结果:

Puma, USPA, Adidas & moreUp to 70% OffMen's Shoes
Shirts, T-Shirts...Under ₹599For Men
Nike, UCB, Adidas & moreUnder ₹999Men's Sandals, Slippers
Philips & moreStarting ₹99LED Bulbs & Emergency Lights

答案 11 :(得分:0)

关于这个问题的更新答案。 lxml已成为在Python中进行Web抓取的首选方式。与scrapy不同,不依赖于Twisted。也得到Hitchhiker's guide to Python的认可。

答案 12 :(得分:0)

Python有很好的选择来抓取网络。最好的框架是scrapy。对于初学者来说可能有些棘手,所以这里有一些帮助。
1.在3.5以上安装python(直到2.7才可以使用)。
2.在conda中创建一个环境(我这样做了)。
3.在某个位置安装scrapy,然后从那里运行。
4. Scrapy shell将为您提供一个交互式界面来测试您的代码。
5. Scrapy startproject projectname将创建一个框架。
6. Scrapy genspider spidername将创建一个蜘蛛。您可以根据需要创建任意数量的蜘蛛。在执行此操作时,请确保您位于项目目录中。


更容易的是使用requestsbeautiful soup。在开始花一小时的时间阅读文档之前,它将解决您的大部分疑问。 BS4提供了多种解析器供您选择。使用user-agentsleep使抓取更加容易。 BS4返回一个bs.tag,因此请使用variable[0]。如果正在运行js,您将无法直接使用request和bs4进行抓取。您可以获取api链接,然后解析JSON以获取所需的信息,或尝试selenium