使用Python进行Web抓取

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

212415 次浏览

您可以使用URLlib2来发出HTTP请求,然后您将获得Web内容。

你可以这样得到它:

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

漂亮的汤是一个Python HTML解析器,它被认为适用于屏幕抓取。

特别是,在这里是他们关于解析HTML文档的教程。

祝你好运!

将urllib2与出色的美丽的汤库结合使用:

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

我从我的网页抓取工作中收集脚本到这个位桶库中。

适用于您的案例的示例脚本:

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

我真的推荐Scrapy.

引用一个被删除的答案:

  • Scrapy爬行比Mechanize快,因为它使用异步操作(在Twisted之上)。
  • 在libxml2之上,Scrapy对解析(X)HTML提供了更好、更快的支持。
  • Scrapy是一个成熟的框架,具有完整的Unicode,处理重定向、gzipped响应、奇数编码、集成的HTTP缓存等。
  • 一旦你进入Scrapy,你可以在不到5分钟的时间内编写一个蜘蛛,下载图像,创建缩略图,并将提取的数据直接导出到CSV或JSON.

我使用刮痕标记(查找URL-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'}]

我强烈建议您查看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

使用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

这里是一个简单的网络爬虫,我使用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()

如果我们考虑从任何特定类别中获取项目的名称,那么我们可以通过使用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

Python有很好的选项来抓取Web.最好的框架是刮伤的。对于初学者来说,这可能有点棘手,所以这里有一些帮助。
1.安装3.5以上的Python(2.7以下的也可以)。
2.在康达创造一个环境(我做了这个)。
3.在一个位置安装Scrapy,并从那里运行。
Scrapy shell将为您提供一个交互式界面来测试您的代码。
Scrapy startproject projectname将创建一个框架。
Scrapy genspider spidername将创建一个蜘蛛。您可以创建任意数量的蜘蛛。执行此操作时,请确保您位于项目目录中。


更简单的方法是使用请求漂亮的汤。在开始之前,花一个小时的时间浏览文档,它将解决您的大部分疑问。BS4提供了广泛的解析器供您选择。使用“user-agent ”和“sleep ”可以使刮擦更容易。bs4返回一个BS.tag,因此使用variable[0]。如果有JS运行,您将无法直接使用请求和BS4进行抓取。您可以获取API链接,然后解析JSON以获取所需的信息,或者尝试selenium