如何将抓取的信息导出到CSV?

时间:2019-06-30 11:45:29

标签: python csv web-scraping beautifulsoup export-to-csv

我有一个代码,借助stackoverflow社区(对@ chitown88的高喊),我能够很好地运行。 该代码的目标是从网站上刮取名称,价格和链接。 当我使用打印功能时,它会给我完美的列表。代码如下:

    import requests
    import csv
    from bs4 import BeautifulSoup
    for x in range(0, 70):
        try:
            urls = 'https://www.meisamatr.com/fa/product/cat/2-%D8%A2%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C.html&pagesize[]=24&order[]=new&stock[]=1&page[]='  +str(x+1) +'&ajax=ok?_=1561559181560'
        source = requests.get(urls).text
        soup = BeautifulSoup(source, 'lxml')
        print('Page: %s' %(x+1))
        for figcaption in soup.find_all('figcaption'):
            price = figcaption.find('span', {'class':'new_price'}).text.strip()
            name = figcaption.find('a', class_='title').text
            link = figcaption.find('a', class_='title')['href']
            print('%s\n%s\n%s' %(price, name, link))
        except:
            break

现在对于最后一部分,我需要将这些信息导出到CSV文件。 我尝试这样做,但到目前为止还没有运气。有什么建议吗?

我试图实现CSV导出功能,如下所示:

    import csv
    import requests
    from bs4 import BeautifulSoup
    csv_file = open('cms_scrape.csv', 'w')
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(['name', 'link', 'price'])
    for x in range(0, 70):
        try:
            urls = 'https://www.meisamatr.com/fa/product/cat/2-%D8%A2%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C.html&pagesize[]=24&order[]=new&stock[]=1&page[]=' + str(x + 1) + '&ajax=ok?_=1561559181560'
            source = requests.get(urls).text
            soup = BeautifulSoup(source, 'lxml')
            print('Page: %s' % (x + 1))
            for figcaption in soup.find_all('figcaption'):
               price = figcaption.find('span', {'class': 'new_price'}).text.strip()
               name = figcaption.find('a', class_='title').text
               link = figcaption.find('a', class_='title')['href']
               print('%s\n%s\n%s' % (price, name, link))
               csv_writer.writerow([name, link, price])
        except:
            break
    csv_file.close()

这段代码只给了我一个csv文件,其名称,链接,价格标头全部位于第1列而不是第1至3列。

2 个答案:

答案 0 :(得分:0)

我建议使用以下结构:

  

csv.DictWriter

undefined

答案 1 :(得分:0)

您可以使用标准的csv.writer()对象将列表作为一行写入CSV文件。该文件应使用utf-8格式编码,并具有newline=''参数(请参阅文档)。

import requests
import csv
from bs4 import BeautifulSoup

with open('output.csv', 'w', newline='', encoding='utf-8') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(['name', 'link', 'price'])

    for x in range(1, 101):
        urls = f'https://www.meisamatr.com/fa/product/cat/2-%D8%A2%D8%B1%D8%A7%DB%8C%D8%B4%DB%8C.html&pagesize[]=24&order[]=new&stock[]=1&page[]={x}&ajax=ok?_=1561559181560'

        source = requests.get(urls).text
        soup = BeautifulSoup(source, 'lxml')

        print(f'Page: {x}')
        figcaptions = soup.find_all('figcaption')

        if figcaptions:
            for figcaption in figcaptions:
                price = figcaption.find('span', {'class':'new_price'}).text.strip()
                name = figcaption.find('a', class_='title').text
                link = figcaption.find('a', class_='title')['href']

                csv_output.writerow([name, link, price])
        else:
            print("Finished")
            break

此外,我建议您通过在字符串前面加上f来使用较新的字符串格式。然后,您可以使用{}在文本中直接包含变量。

当检测到不存在figcaption条目时,您可以跳出循环。

这将为您提供一个以CSV文件开头的文件:

name,link,price
کاتریس پودر برنزه سان گلو 030,https://www.meisamatr.com/fa/product/آرایشی/آرایش-صورت/پودر-صورت/6288-کاتریس-پودر-برنزه-سان-گلو-030.html,"68,500 تومان"
اوتلت بورژوا مداد لب ادیشن 12,https://www.meisamatr.com/fa/product/آرایشی/آرایش-لب/مداد-لب/6286-اوتلت-بورژوا-مداد-لب-ادیشن-12.html,"57,000"