这周,我们老师让我们写个爬取电商数据的作业,题目如下
对此,我选择了在当当网上爬取“python爬虫”的数据,接下来我将附上我写的代码:
# -*- coding: utf-8 -*-
import requests
import csv
from bs4 import BeautifulSoup as bs
#获取网页信息
def request_dandan(url):
try:
#用户代理
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
r = requests.get(url,headers=headers)
if r.status_code == 200:
return r.text
except requests.RequestException:
return None
#存放列名
def write_item_to_file():
csv_file = open('dangdang.csv', 'w', newline='', encoding="utf-8")
writer = csv.writer(csv_file)
writer.writerow(['书名','购买链接','纸质书价格','电子书价格','电子书链接','作者','出版时间','出版社'])
print('列名已成功放入CSV中')
#解析网页并写入csv文件中
def parse_dangdang_write(html):
csv_file = open('dangdang.csv', 'a', newline='', encoding="utf-8")
writer = csv.writer(csv_file)
#解析网页
soup = bs(html, 'html.parser')
class_tag = ['line'+str(x) for x in range(1,61)]
for class_tag in class_tag:
li = soup.find('li',class_=class_tag)
book_name = li.find('a',class_='pic').get('title') # 书名
paperbook_price = li.find('span',class_='search_now_price').text #纸质书价格
try:
ebook_price = li.find('a',class_='search_e_price').find('i').text #电子书价格
ebook_link = li.find('a',class_='search_e_price').get('href') #电子书链接
except:
ebook_price = ''
ebook_link = ''
#detail = li.find('p',class_='detail').text #书的详细介绍
book_purchase_link = li.find('a',class_='pic').get('href') #每本书的详细购买链接
#book_cover_link = li.find('a',class_='pic').find('img').get('src')#书的封面地址
#comment_link = li.find('a',class_='search_comment_num').get('href') #评论地址
author = li.find('p',class_='search_book_author').find('span').text # 书的作者
public_time = li.find('p',class_='search_book_author').find('span').next_sibling.text[2:]#出版时间
public = li.find('p',class_='search_book_author').find('span').next_sibling.next_sibling.text[3:]#出版社
writer.writerow([book_name,book_purchase_link,paperbook_price,ebook_price,ebook_link,author,public_time,public])
csv_file.close()
if __name__=='__main__':
write_item_to_file()
for page in range (1,10):#爬取9页数据存入csv文件
url = 'http://search.dangdang.com/?key=python%C5%C0%B3%E6&act=input&page_index=' + str(page)
html = request_dandan(url) #获取网页信息
parse_dangdang_write(html)#解析网页并写入csv文件中
print('第{}页数据成功放入CSV中'.format(page))
控制台输出如下:
csv文件(截取一部分):
可见,9页数据总共有540条数据(除掉列名)
这个爬虫代码的缺点:
没有使用虚拟ip代理自己的ip,也没有使用cookie保持会话