import requests
from lxml import etree
import json
from bs4 import BeautifulSoup
class BookSpider(object):
def __init__(self):
self.base_url = "http://www.allitebooks.org/page/{}/"
self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"}
self.data_list =[]
def get_url_list(self):
url_list = []
for i in range(3):
url = self.base_url.format(i)
url_list.append(url)
return url_list
def send_request(self,url):
data = requests.get(url,headers=self.headers).content.decode()
return data
def parse_bs4_data(self,data):
bs4_data =BeautifulSoup(data,"lxml")
book_list = bs4_data.select(".article")
for book in book_list:
book_dict = {}
book_dict["book_name"] = book.select_one('.entry-title').get_text()
book_dict["book_img_url"] = book.select_one('.attachment-post-thumbnail').get("src")
book_dict["book_author"] = book.select_one('.entry-author').get_text()
book_dict["book_info"] = book.select_one('.entry-summary p').get_text()
self.data_list.append(book_dict)
def parse_xpath_data(self,data):
parse_data = etree.HTML(data)
book_list = parse_data.xpath('//div[@class="main-content-inner clearfix"]/article')
for book in book_list:
book_dict={}
book_dict["book_name"] = book.xpath('.//h2[@class="entry-title"]//text()')[0]
book_dict["book_img_url"] = book.xpath('div[@class="entry-thumbnail hover-thumb"]/a/img/@src')[0]
book_dict["book_author"]=book.xpath('.//h5[@class="entry-author"]/a/text()')[0]
book_dict["book_info"] = book.xpath('.//div[@class="entry-summary"]/p/text()')[0]
self.data_list.append(book_dict)
def save_data(self):
json.dump(self.data_list,open("04book.json","w"))
def start(self):
url_list =self.get_url_list()
for url in url_list:
data =self.send_request(url)
self.parse_bs4_data(data)
self.save_data()
BookSpider().start()