源代码:

  1. #2022-03-01 xpath爬取某大学新闻网站
  2. import requests
  3. from lxml import etree
  4. import time
  5. for i in range(95):#一共有95
  6. headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
  7. url='http://journal.whu.edu.cn/news/index/page/{}'.format(i)
  8. response=requests.get(url=url,headers=headers).text
  9. html=etree.HTML(response)
  10. lis=html.xpath('/html/body/div[3]/div/div/ul/li')#拿到所有的li
  11. for li in lis:
  12. title=li.xpath('./div[2]/h4/a/text()')[0]#获取标题
  13. dt=li.xpath('./div[2]/div[2]/text()')[0]#获取日期
  14. href=li.xpath('./div[2]/h4/a/@href')[0]#获取页面链接
  15. href2='http://journal.whu.edu.cn/news'+href#拼接起来
  16. print(title,dt,href2)
  17. time.sleep(2)#休息一下,避免频繁访问
  18. with open(r"wunews.txt","a",encoding="utf-8") as f: #使用with open()新建对象f ,a 表示追加,
  19. f.write("{},{},{}".format(title,dt,href2)) #将列表中的数据循环写入到文本文件中
  20. f.write("\n")#换行

分析:

1、访问网站信息

url=“http://journal.whu.edu.cn/news

  1. import requests
  2. headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
  3. url='http://journal.whu.edu.cn/news'
  4. response=requests.get(url=url,headers=headers)
  5. print(response.text)

2、解析数据,拿到所有li标签

  1. import requests
  2. from lxml import etree
  3. headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
  4. url='http://journal.whu.edu.cn/news'
  5. response=requests.get(url=url,headers=headers).text
  6. html=etree.HTML(response)
  7. lis=html.xpath('/html/body/div[3]/div/div/ul/li')#拿到所有的li
  8. print(len(lis))

image.png

copy得到的xpath是:/html/body/div[3]/div/div/ul/li[1],需要的是所有的li,所以把[1]去掉

3、找到单个li,并查找所有需要的字段

  1. import requests
  2. from lxml import etree
  3. import time
  4. headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
  5. url='http://journal.whu.edu.cn/news'
  6. response=requests.get(url=url,headers=headers).text
  7. html=etree.HTML(response)
  8. lis=html.xpath('/html/body/div[3]/div/div/ul/li')#拿到所有的li
  9. for li in lis:
  10. title=li.xpath('./div[2]/h4/a/text()')[0]#获取标题,获取的列表,列表里面只有一个元素,所以用[0]
  11. dt=li.xpath('./div[2]/div[2]/text()')[0]#获取日期
  12. href=li.xpath('./div[2]/h4/a/@href')[0]#获取页面链接
  13. href2='http://journal.whu.edu.cn/news'+href#拼接起来
  14. print(title,dt,href2)
  15. time.sleep(2)

输出结果为:
image.png
image.png

其他字段也是一样的方法:点击按钮,在网页中点击你想查找的部分,在Elements对应代码中点击右键,Copy->Copy Xpath

4、保存数据

  1. import requests
  2. from lxml import etree
  3. import time
  4. for i in range(95):#一共有95
  5. headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'}
  6. url='http://journal.whu.edu.cn/news/index/page/{}'.format(i)
  7. response=requests.get(url=url,headers=headers).text
  8. html=etree.HTML(response)
  9. lis=html.xpath('/html/body/div[3]/div/div/ul/li')#拿到所有的li
  10. for li in lis:
  11. title=li.xpath('./div[2]/h4/a/text()')[0]#获取标题
  12. dt=li.xpath('./div[2]/div[2]/text()')[0]#获取日期
  13. href=li.xpath('./div[2]/h4/a/@href')[0]#获取页面链接
  14. href2='http://journal.whu.edu.cn/news'+href#拼接起来
  15. print(title,dt,href2)
  16. time.sleep(2)#休息一下,避免频繁访问
  17. with open(r"wunews.txt","a",encoding="utf-8") as f: #使用with open()新建对象f ,a 表示追加,
  18. f.write("{},{},{}".format(title,dt,href2)) #将列表中的数据循环写入到文本文件中
  19. f.write("\n")#换行

image.png

1、分析网站url可得到,每一页就是一个page,page1、2、3、、、95 一共有95页,所以用for循环来保存每一页数据: for i in range(95):#一共有95页 url=’http://journal.whu.edu.cn/news/index/page/{}’.format(i)) 2、用with open来打开一个对象文件

5、爬取完成

注意:
1、这种最简单的访问方式,很容易导致ip被封,请谨慎执行!
(执行3-5次,好像没啥问题,执行多了,就封了。。。)
2、可以尝试使用selenium方式来访问