使用漂亮汤的python爬虫

时间:2019-06-11 17:57:39

标签: python-3.x

我正在使用python做一个简单的爬网项目。我正在尝试将数据写入csv文件,但没有将任何内容写入csv文件

我尝试使用美丽的汤,对此我是完全陌生的

def article(self):
 url="https://www.amazon.in/s?i=electronics&bbn=1389401031&rh=n%3A976419031%2Cn%3A976420031%2Cn%3A1389401031%2Cp_89%3ASamsung%2Cp_36%3A1318504031&dc&fst=as%3Aoff&qid=1560269023&rnid=1318502031&ref=sr_nr_p_36_2"
      a=[]
      r=requests.get(url)
      doc=BeautifulSoup(r.text,"html.parser")

      for cards in doc.select(".sg-col-inner"):

          title=cards.select_one(".a-size-medium a-color-base a-text-normal").text
          price=cards.select_one(".a-size-base").text
          crawled=crawledArticle(title,price)
          a.append(crawled)
      return a 

import csv
fetcher = b()

with open('pro.csv', 'w', newline='') as csvfile:
    articlewriter = csv.writer(csvfile, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)

    for article in fetcher.article():
        articlewriter.writerow([article.title,article.price])

csv文件为空

1 个答案:

答案 0 :(得分:1)

亚马逊已采取措施防止刮擦,因此您的方法在大多数时间可能无法正常工作,因为亚马逊会检测到您正在刮擦,并可能会将您重定向到验证码页面,以在您刮擦产品之前验证您是否为人类。

解决此问题的一种方法是使用 。 Selenium是浏览器的自动工具,可让您像由人而不是程序来访问页面一样。

要使用它,必须先安装硒:

pip install selenium

并且您还需要为所需的浏览器安装驱动程序(在此示例中,我使用的是chrome)。

对于chrome驱动程序,请转到http://chromedriver.chromium.org/downloads,然后根据您当前的chrome版本和操作系统下载正确的驱动程序。将其放在与python程序相同的文件夹(目录)中。

以下是用硒刮擦亚马逊网页的代码:

import csv
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


class crawledArticle():
    def __init__(self,title,price):
        self.title=title
        #self.rating=rating
        self.price=price

class b:

    def article(self):
        a = []

        url="https://www.amazon.in/s?i=electronics&bbn=1389401031&rh=n%3A976419031%2Cn%3A976420031%2Cn%3A1389401031%2Cp_89%3ASamsung%2Cp_36%3A1318504031&dc&fst=as%3Aoff&qid=1560269023&rnid=1318502031&ref=sr_nr_p_36_2"

        options = Options()
        options.headless = True
        browser = webdriver.Chrome(options=options)
        browser.get(url)

        count = 1
        while True:
            try:
                title = browser.find_element_by_xpath('//*[@id="search"]/div[1]/div[2]/div/span[3]/div[1]/div[' + str(count) + ']/div/div/div/div[2]/div[2]/div/div[1]/div/div/div[1]/h2/a/span')
                price = browser.find_element_by_xpath('//*[@id="search"]/div[1]/div[2]/div/span[3]/div[1]/div[' + str(count) + ']/div/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[1]/div/div/a/span[1]/span[2]/span[2]')

                info = crawledArticle(title.text, price.text)
                a.append(info)

                count += 1

            except: break

        browser.close()

        return a


fetcher = b()

with open('pro.csv', 'w', newline='') as csvfile:
    articlewriter = csv.writer(csvfile, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    for article in fetcher.article():
        articlewriter.writerow([article.title,article.price])

通常,硒会打开浏览器窗口,但是options.headless = True会阻止它。

这是做什么的:通过产品的xpath搜索产品的标题和价格,将信息放入crawledArticle的实例中,并将其添加到列表a[]中。文件pro.csv打开,并将信息写入文件。

元素的xpath只是通过html元素的层次结构找到它的一种方法。在chrome中,您可以通过以下方法找到它:转到检查菜单,突出显示所需的元素,然后右键单击,转到“复制”>“复制Xpath”。更多信息here

这是pro.csv的内容:

Samsung Guru 1200 (GT-E1200, Black);1,100
Samsung Guru Music 2 (SM-B310E, Blue);1,625
Samsung Guru Music 2 (SM-B310E, Black);1,625
Samsung Guru Music 2 SM-B310E (White);1,625
Samsung EO-BG920BFEGIN Bluetooth Headset with mic (Gold);2,399
Samsung Guru 1200 (Gold);1,100
Samsung EVO Plus Grade 3 Class 10 128GB MicroSDXC Memory Card with SD Adapter (MB-MC128GA/IN);1,793
Samsung Guru 1200 (GT-E1200, Indigo Blue);1,100
Samsung Guru Music 2 (Gold);1,625
Samsung Guru FM Plus (SM-B110E/D, Dark Blue);1,375
Samsung Guru 1200 (GT-E1200, White);1,100
Samsung EO-BG920BBEGIN Bluetooth Wireless in-Ear Headphones with mic(Black-Sapphire);2,699
Samsung Guru FM Plus (SM-B110E/D, Black);1,375
Samsung Guru FM Plus (Gold);1,375
Samsung EO-BG950CBEGIN Bluetooth Wireless in-Ear Flexible Headphones with Microphone (Black);3,580
Samsung Guru FM Plus (SM-B110E/D, White);1,375
Samsung Metro 350 (Gold);3,070
Samsung Level U Bluetooth Stereo Headset Flexible Joint With Neckband ( Gold );2,479

有关硒的信息---

官方网站:https://www.seleniumhq.org

非官方文档(非常有用):https://selenium-python.readthedocs.io/