抓取网页生成电子书(从里抓取书籍列表的书籍信息和每本书对应的ISBN码)

优采云 发布时间: 2022-03-16 10:16

  抓取网页生成电子书(从里抓取书籍列表的书籍信息和每本书对应的ISBN码)

  本文首先抓取图书列表的图书信息和每本书对应的ISBN码。

  一、分析需求和网站结构

  这个网站的结构很简单,分页+书单+书详情页。

  获取图书的详细信息和ISBN码,我们需要遍历所有页码,进入图书列表,然后从图书列表中进入每本书的详细信息页面,这样就可以抓取到详细信息和ISBN代码。

  二、 从分页开始遍历书单的每一页

  

  通过查看分页功能的HTML代码,可以通过class="current"定位到当前页码所在的span标签。这个span标签的下一个兄弟a标签是指向下一页的链接所在的标签。

  通过比较最后一页的span可以发现,在最后一页中,class="current"找到的span标签没有下一个兄弟a标签。所以我们可以用它来判断我们是否已经到了最后一页。代码显示如下:

  # Get the next page url from the current page url

def get_next_page_url(url):

page = urlopen(url)

soup_page = BeautifulSoup(page, 'lxml')

page.close()

# Get current page and next page tag

current_page_tag = soup_page.find(class_="current")

next_page_tag = current_page_tag.find_next_sibling()

# Check if the current page is the last one

if next_page_tag is None:

next_page_url = None

else:

next_page_url = next_page_tag['href']

return next_page_url

  三、从书单中找到详细页面的链接

  点击书单中的书名或封面图进入详情,然后选择书名和封面图之一,在此处选择书名。

  

  我们可以通过查找class="entry-title"来定位书名所在的h2标签,然后通过这个标签的a属性获取链接所在的a标签,再通过字符串获取链接a 标签的属性。

  代码显示如下:

  # Get the book detail urls by page url

def get_book_detail_urls(url):

page = urlopen(url)

soup = BeautifulSoup(page, 'lxml')

page.close()

urls = []

book_header_tags = soup.find_all(class_="entry-title")

for book_header_tag in book_header_tags:

urls.append(book_header_tag.a['href'])

return urls

  四、从图书详情页面获取书名和 ISBN 码

  

  通过查看图书详情页的HTML代码,我们可以通过查找class="single-title"获取书名,定位到书名所在的h1标签,然后定位到"Isbn:"所在的dt标签通过查找 text="Isbn:" 进行定位,该标签的下一个兄弟节点就是该书的 ISBN 码所在的标签,通过该标签的字符串属性可以获取 ISBN 码的内容。

  代码显示如下:

  # Get the book detail info by book detail url

def get_book_detail_info(url):

page = urlopen(url)

book_detail_soup = BeautifulSoup(page, 'lxml')

page.close()

title_tag = book_detail_soup.find(class_="single-title")

title = title_tag.string

isbn_key_tag = book_detail_soup.find(text="Isbn:").parent

isbn_tag = isbn_key_tag.find_next_sibling()

isbn = isbn_tag.string.strip() # Remove the whitespace with the strip method

return { 'title': title, 'isbn': isbn }

  五、整合三部分代码

  def run():

url = "http://www.allitebooks.com/programming/net/page/1/"

book_info_list = []

def scapping(page_url):

book_detail_urls = get_book_detail_urls(page_url)

for book_detail_url in book_detail_urls:

# print(book_detail_url)

book_info = get_book_detail_info(book_detail_url)

print(book_info)

book_info_list.append(book_info)

next_page_url = get_next_page_url(page_url)

if next_page_url is not None:

scapping(next_page_url)

else:

return

scapping(url)

  运行结果

  

  六、将结果写入文件以供进一步处理

  def save_to_csv(list):

with open('books.csv', 'w', newline='') as fp:

a = csv.writer(fp, delimiter=',')

a.writerow(['title','isbn'])

a.writerows(list)

  待续...

  完整代码请移步github:

  Beautiful Soup 基础知识:Web 爬虫:从刮书信息和刮价格 (1): Basics Beautiful Soup

  我们正处于大数据时代,欢迎对数据处理感兴趣的朋友查看另一个系列随笔:Using Python for Data Analysis Basics 系列随笔小结

  接下来的作文是网站根据得到的ISBN码得到每本书对应的价格,通过数据分析的知识对得到的数据进行处理,最后输出成csv文件。感兴趣的朋友欢迎关注本博客,也欢迎留言讨论。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线