2014-10-03 55 views
0

我想构建一个scrape工具,它导入一个csv文件,然后将csv的每一行附加到一个url,然后为特定字段擦除该url。到目前为止,该工具将所有的URL和擦伤的数据,但它只返回数据为第2,只是显示为休息的网址:刮刀只返回前2个输入的结果

import urllib 
import re 
import requests 
from numpy import genfromtxt 
from time import sleep 

my_data = genfromtxt('ASINS.csv', delimiter=',', dtype=None) 

for ASIN in my_data[:20]: 
    url = "http://www.amazon.com/gp/product/" + ASIN[1:11] 
    sleep(1.5) 
    website_html = requests.get(url).text 
    print len(website_html) 
    print url 

    ranks = re.findall(r'#.\sin\s.*', website_html) 
    for rank in ranks: 
     print rank 

输出只返回刮为先,下面的例子:

344781 
http://www.amazon.com/gp/product/B00DPE9EQO 
#1 in Beauty (<a href="http://www.amazon.com/gp/bestsellers/beauty">See Top 100 in  Beauty</a>) 
1378 
http://www.amazon.com/gp/product/B00CD0H1ZC 
327515 
http://www.amazon.com/gp/product/B00GP184WO 
1378 
http://www.amazon.com/gp/product/B00CAZAU62 
1378 
http://www.amazon.com/gp/product/B00KCFAZTE 
1378 
http://www.amazon.com/gp/product/B00C7DYBX0 
3 

,并从CSV剪断:

B00DPE9EQO 
B00CD0H1ZC 
B00GP184WO 
B00CAZAU62 
B00KCFAZTE 
B00C7DYBX0 
B00IS8Y0HK 
B00CKFL93K 
B00DDT116M 
B00GYF65TK 
B00JV8L5N8 

任何人都可以给我为什么它可能是这个产品的投入?

回答

1

几件事情,帮我刮你请求的数据:有助于保持饼干

完整代码:

from time import sleep 

from bs4 import BeautifulSoup 
from numpy import genfromtxt 
import requests 


my_data = genfromtxt('ASINS.csv', delimiter=',', dtype=None) 

# initialize a session 
session = requests.Session() 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36'} 

for ASIN in my_data[:20]: 
    url = "http://www.amazon.com/gp/product/" + ASIN[1:11] 
    sleep(1.5) 

    response = session.get(url, headers=headers) 
    soup = BeautifulSoup(response.content) 

    print url 
    # get best seller rankings 
    for rank in soup.select('ul.zg_hrsr li.zg_hrsr_item'): 
     print rank.text 
    print "----" 

打印:

http://www.amazon.com/gp/product/B00DPE9EQO 

#1 
in Health & Personal Care > Vitamins & Dietary Supplements > Vitamins > Vitamin C > C-Complex 


#1 
in Beauty > Skin Care > Face > Creams & Moisturizers > Fluids & Lotions > Fluids 


#1 
in Beauty > Skin Care > Face > Oils & Serums 

---- 
http://www.amazon.com/gp/product/B00CD0H1ZC 

#1 
in Pet Supplies > Dogs > Grooming > Shedding Tools 


#1 
in Pet Supplies > Cats > Grooming > Shedding Tools 

---- 
http://www.amazon.com/gp/product/B00GP184WO 

#1 
in Health & Personal Care > Health Care > Sleep & Snoring > Sleeping Masks 

---- 
... 
+0

哇这个作品非常漂亮!如果我只想返回第一个类别而不是子类别,我将如何更改该部分? – amazingacademy 2014-10-03 16:08:41

+0

@amazingacademy让我问你,第一类是什么意思。例如,对于[本产品](http://www.amazon.com/gp/product/B00DPE9EQO),您期望的输出是什么?谢谢。例如, – alecxe 2014-10-03 16:11:23

+0

例如,一种产品将是健康和个人护理>维生素和膳食补充剂中的#1,以及健康和个人护理中的#3。它在亚马逊产品页面上列出,如果它不止一个。我想只返回第一个。 – amazingacademy 2014-10-03 16:16:13

0

首先,所有这些都是一样的尺寸小,1378个字节长的结果,很可能“404未找到”某种形式的网页。我会尝试使用if len(website_html) == 1378: print website_html进行一次测试,看看输出是什么。如果事实证明您收到了404 Not Found或其他一些错误,例如“您检索页面速度过快,我们认为您是机器人,所以我们不会给您该页面”,那么您会知道如何修正你的代码(例如,在后一种情况下增加sleep()时间)。

其次,只有在#后有一个字符时,您的正则表达式才有效。如果某事排在第10位或更低(例如数字更高的排名数),则您的正则表达式将失败。尝试#\d+而不是#.,看看是否有帮助。

......啊。在我写这篇文章的时候,别人给了一个更好的答案。好。我仍然会发布这个,因为我提出的建议没有重复,他们也可能会帮助。

+1

使用'BeautifulSoup'比正则表达式好得多。忽略我的“如何解决你的正则表达式”的建议,并与alecxe的答案一起去。 – rmunn 2014-10-03 15:58:58

+0

感谢您的提示,我很新的python,但我现在正在寻找BeautifulSoup和Scrapy – amazingacademy 2014-10-03 16:10:32