前言

这几天又看了下python的视频,突然又对python感兴趣起来。以前只是学了下python的基础,感觉和其他语言没什么大的区别,再加上编程游戏的插件pygame一直没装上,遂放弃了。

最近心血来潮突然又想用python来搞游戏开发,就上网搜了教程安装pygame,这一搜便一发不可收拾。得知安装pygame需先安装pip,我就按着教程来,刚开始看的第一个教程是错的,走了很多弯路,后来果断换教程。pip的安装可真不一样用的是cmd命令行来安装,只要切换到相应路径,输入pip install,后面文字就一直滚动,看的贼爽。习惯了windows死板的next,next无脑式,用这个可算真长见识了,也牛逼多了。

行吧,不讲那么多话外题了。要想用python爬取网页内容得先安装python3.7,pip

输入python

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_python


输入pip

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_json_02


如果你输入的结果反馈和我的都一样就证明你的安装成功了,且环境变量也配置好了。

具体python安装可以在其他博客上看,以后我也打算把所有工具的安装教程都分享下来,给路过的小白看看。

python推荐教程:添加链接描述 小甲鱼的视频诙谐幽默,通俗易懂,极力推荐

首先爬取的是html内容

用python爬取一只猫的图片

import urllib.request

response =urllib.request.urlopen('http://placekitten.com/200/300')
cat_img =response.read()

with open('cat_200_300.jpg','wb') as f:
    f.write(cat_img)

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_html_03


wow当时出了这只猫图片的时候我还是相当兴奋的,原本只有.py一个文件,在Idle上运行过后,蹦出一只猫出来,当时我就知道自己成功爬取了网页内容!!!怎么讲呢这只是一小步吧,主要让我认识到了学习编程给我带来的巨大便利,而这是c语言和java从未给我的感觉。

ps:图片生成的默认途径是.py同级目录

当我爬取一个图片后就想着能不能一次性爬取更多的图片,可以想象,当初创建公众号的时候,为了写点段子,我在百度上搜了好多的图,都是一个一个的点击下载,特别麻烦。现在通过python只需要按一下回车键成百上千的图片就会出现在我的文件夹里,再不需要一个一个去点了。

刚开始我是先看了一遍视频,第二遍看的时候就照着视频敲,代码量少的还行。十二十行的还凑合,一旦代码量达到数百行,bug量就飙升了。所以我推荐那些代码多的就直接去网上找源码了,直接复制粘贴下来,运行,弄出成果来,在回过头来学习分析代码,也不失为一种好的策略。
我起码花了一个小时去敲源码,后面是由于代码多,运行结果和视频不一致,被迫放弃的。但在敲的过程中我确实对代码结构有了更清楚的认识。

通过python爬取网页内容(正文)

以搜狗图片为例

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_json_04


爬到的图片

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_html_05

import requests
import json
import urllib

def getSogouImag(category,length,path):
    n = length
    cate = category
    imgs = requests.get('http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category='+cate+'&tag=%E5%85%A8%E9%83%A8&start=0&len='+str(n))
    jd = json.loads(imgs.text)
    jd = jd['all_items']
    imgs_url = []
    for j in jd:
        imgs_url.append(j['bthumbUrl'])
    m = 0
    for img_url in imgs_url:
            print('***** '+str(m)+'.jpg *****'+'   Downloading...')
            urllib.request.urlretrieve(img_url,path+str(m)+'.jpg')
            m = m + 1
    print('Download complete!')

getSogouImag('美女',200,'d:/download/风景/')

其中美女是搜索的关键词,而d:/download/风景/是下载后的图片路径

注意:没有安装requests库的同学,百度一下,用pip直接install就行。
刚开始报错不知道怎么回事一看是第一行,语法也没错啊,就知道是导入的库出错了。

我再提供一种更新的更高级你可以自己键入关键词,且分辨率更高的图片,当然啦,这也都是我从网上找的:

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_python_06


右边的是出现的图形用户交互界面,你可以任意输入关键字来获取你想得到的图片

(左边红字直接忽略掉吧,反正运行成功,且操作正常)动漫美女文件夹为空

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_python_07


Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_json_08


Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_json_09


在依次下载,稍后我们看看文件夹里出现了什么

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_html_10


wow好多图片啊,而且后面还在一直增加

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_html_11


到100个的时候停止。这里有重复图片,极有可能是动漫美女类的主题图片不够,只能用重复的来滥竽充数,凑够100个

Java 爬取walmart 怎么做到js动态渲染 java爬取网页图片_python_12

下面贴个源码吧,以后好好分析,争取一日,到网上肆虐爬取图片去

#-*- encoding=UTF-8 -*-
import urllib.request,socket,re,sys,os
from urllib.request import urlopen
import time
from tkinter import *
import webbrowser
from bs4 import BeautifulSoup
import requests
import json
import urllib
 
##############################常量区##############################
sougou_url="http://pic.sogou.com/"
###URL
download_pics_path="D:/download/动漫美女/"
download_pics_num=10
download_success = ""
sougou_pics_tag=["pic_url","thumbUrl","bthumbUrl","ori_pic_url"]
sougou_url_pics_start="http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category="
sougou_url_pics_mid="&tag=%E5%85%A8%E9%83%A8&start=0&len="
sougou_url_pics_start_other="http://pic.sogou.com/pics?query="
sougou_url_pics_mid_other="&did=1&mode=1&start=0&len="
sougou_url_pics_stop_other="&reqType=ajax"
###title
title_key_start="a class=\"nav-tab\" href=\"/pics/"
title_key_stop="<"
###tkinter
window_name="搜狗图片下载器"
window_size="500x700"
frm_bg="white"
real_columnspan=4
label_type_str="---------------------------------------------图片类型---------------------------------------------"
##############################常量区##############################
 
real_url_arr = [] ###组成url集合
 
##############################函数区##############################
###获取网页上标题,返回标题数组
def get_title(url):
    html = urlopen(url)
    sougou_html = BeautifulSoup(html.read())
    title_key = []
    for ihtml in sougou_html:
        data1 = str(ihtml).split(title_key_start)
        if len(data1) > 1:
            for jhtml in data1:
                data2 = jhtml.split(title_key_stop)[0]
                data3 = data2.split("\">")
                if len(data3) == 2:
                    title_key.append(data3[1])
    return title_key
 
###获取网页图片并下载,返回下载失败个数
def get_pics(url,path):
    # 检测当前路径的有效性
    if not os.path.isdir(path):
        os.mkdir(path)
    pics_str = requests.get(url)
    pics_dict = json.loads(pics_str.text)
    pics_dict_items = pics_dict['all_items']
    i_item=0
    fail_count=0
    for item in pics_dict_items:
        fail_flag=0
        for itag in sougou_pics_tag:
            try:
                pic_url=item[itag]
                pic_title=item['title']
                if pic_title == "":
                    pic_title = str(i_item)
                    i_item = i_item + 1
                if pic_url != "":
                    urllib.request.urlretrieve(pic_url, path + pic_title + '.jpg')
                    print(pic_title+": download complete!")
                    fail_flag=1
                    break
            except:
                print("download fail!")
                continue
        if fail_flag != 1:
            fail_count=fail_count+1
    return fail_count
 
def get_pics_other(url,path):
    pics_str = requests.get(url)
    pics_dict = json.loads(pics_str.text)
    pics_dict_items = pics_dict['items']
    i_item=0
    fail_count=0
    for item in pics_dict_items:
        fail_flag=0
        for itag in sougou_pics_tag:
            try:
                pic_url=item[itag]
                pic_title=item['title']
                pic_title=pic_title+str(i_item)
                i_item = i_item + 1
                if pic_url != "":
                    urllib.request.urlretrieve(pic_url, path + pic_title + '.jpg')
                    print(pic_title+": download complete!")
                    fail_flag=1
                    break
            except:
                print("download fail!")
                continue
        if fail_flag != 1:
            fail_count=fail_count+1
    return fail_count
 
def url_get_othertype():
    global real_url_arr
    if PhotoType.get() != "":
        real_url_arr.append(PhotoType.get())
        real_url_arr = list(set(real_url_arr))
 
def url_get_phototype(all_type):
    global real_url_arr
    real_url_arr=[]
    url_get_othertype()
    if "其他" in all_type:
        all_type.remove("其他")
    for i in range(len(all_type)):
        if CheckType[i].get() == 1:
            real_url_arr.append(typeBtn[all_type[i]]['text'])
    real_url_arr = list(set(real_url_arr))
 
def other_type():
    if OtherType.get() == 1 :
        type["state"] = "normal"
    else:
        type["state"] = "disabled"
        PhotoType.set("")
 
def get_full_url(all_type):
    global download_pics_num
    down_result["text"] = ""
    url_get_phototype(all_type)
    if download_num_str.get() != "":
        download_pics_num = int((download_num_str.get()))
    sum = len(real_url_arr) * download_pics_num
    down_result["text"] = "准备下载: " + str(sum) + "张照片"
    fail_num = 0
    for iurl in real_url_arr:
        if iurl in photo_type:
            tmp_url=sougou_url_pics_start+iurl+sougou_url_pics_mid+str(download_pics_num)
            fail_num = fail_num + get_pics(tmp_url, download_pics_path)
        else:
            tmp_url=sougou_url_pics_start_other + iurl + sougou_url_pics_mid_other + str(download_pics_num) + sougou_url_pics_stop_other
            time.sleep(1)
            fail_num = fail_num + get_pics_other(tmp_url, download_pics_path)
    down_result["text"] ="成功下载: " + str(sum-fail_num) + "张照片"
 
###tkinter label占一行
def write_line(row,text="",column=0,columnspan=real_columnspan,bg=frm_bg):
    label = Label(frm, text=text, bg=bg)
    label.grid(row=row, column=column,columnspan=columnspan)
    return label
 
###调用网页
def callback(url=sougou_url):
    webbrowser.open_new(url)
 
##############################函数区##############################
 
##############################UI部分##########################################
root =Tk() #给窗体
root.title(window_name) #设置窗体名字
root.geometry(window_size)
root.resizable(width=False, height=False) ###固定窗体大小
 
frm=Frame(root,bg=frm_bg) #新建框架
frm.pack(expand = YES,fill = BOTH) #放置框架
 
###控制行的参数
real_row=0
###空一行
write_line(real_row)
real_row=real_row+1
###进入官网
Button(frm,text="点击进入搜狗图片官网",command=callback).grid(row=real_row,column=0,columnspan=real_columnspan,sticky=N)
real_row=real_row+1
###空一行
write_line(real_row)
real_row=real_row+1
###图片类型
write_line(real_row,label_type_str)
real_row=real_row+1
###空一行
write_line(real_row)
real_row=real_row+1
 
###checkbutton
photo_type=get_title(sougou_url)
photo_type.append("其他")
typeBtn={}
CheckType=[]
real_column=0
for itype in photo_type:
    if itype == "其他":
        OtherType = IntVar()
        PhotoType = StringVar()
        type = Entry(frm, textvariable=PhotoType, width=9, state='disabled')  # 添加输入框
        Checkbutton(frm, text="其他", variable=OtherType, onvalue=1, offvalue=2, command=other_type).grid(row=real_row, column=1)
        type.grid(row=real_row, column=2, columnspan=4, sticky=W, padx=40, ipadx=60)  # 放置输入框位置
    else:
        CheckType.append(IntVar())
        typeBtn[itype]=Checkbutton(frm, text=itype, variable=CheckType[-1], command=lambda: url_get_phototype(photo_type))
        typeBtn[itype].grid(row=real_row, column=real_column)
    real_column=real_column+1
    if real_column == 4:
        real_column = 0
        real_row = real_row + 1
real_row=real_row+1
 
###空一行
write_line(real_row)
real_row=real_row+1
 
###下载个数
lab1 = Label(frm,text = "下载个数:")# 添加Label
lab1.grid(row = real_row,column=0)
download_num_str = StringVar()
download_num = Entry(frm,width=10,textvariable=download_num_str)# 添加Entry
download_num.grid(row = real_row,column=1,sticky=W)
real_row=real_row+1
 
###空一行
write_line(real_row)
real_row=real_row+1
 
###get
Button(frm,text="获取照片",command=lambda: get_full_url(photo_type)).grid(row=real_row,column=0,columnspan=4,sticky=N)
real_row=real_row+1
 
###空一行
write_line(real_row)
real_row=real_row+1
 
###结果
down_result=write_line(real_row)
real_row=real_row+1
 
###空一行
write_line(real_row)
real_row=real_row+1
 
Button(frm,text="退出程序",command=root.quit).grid(row=real_row,column=0,columnspan=4,sticky=N)
real_row=real_row+1
 
mainloop()
##############################UI部分##########################################

等我学成之后,似乎就可以批量爬点小黄图回来收藏收藏了(手动滑稽)

这是另一段代码

import requests
import bs4
import base64
import urllib.request
num_photo = 1
def download_photo(url , num ):
  global num_photo
  response = urllib.request.urlopen(url)
  cat = response.read()
  with open( 'E:/编程/python/练习' + num + '.jpg' , 'wb') as f :
      f.write(cat)
  a = num_photo
  print("当前已下载第%d张" % a)

  num_photo = num_photo + 1 
  
def get_url(url): # 下载这个网页
    headers = { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6735.400 QQBrowser/10.2.2614.400" }
    res = requests.get(url , headers = headers)
    return res
def get_soup(res):
    soup = bs4.BeautifulSoup(res.text , "html.parser")
    return soup

def get_page(num):
    
   # url = input("请输入一个url:")
    url = "http://jandan.net/ooxx/page-" + str(num) + "#comments"
    large_url = "http://wx2.sinaimg.cn/large/"
    res = get_url(url)
   # with open("date.txt","w" , encoding ='utf-8') as file:
   #         file.write(res.text)
   # print(res.text)
    soup = get_soup(res)
    num = 0 
    for i in soup.select('.img-hash'):
        #print(i.text)
        num = num + 1 
        link = base64.b64decode(i.text.encode('utf-8'))
       # print(link)
        B_link = str(link , 'utf-8').split('/')[-1]
        #去找到他的哈希码
        #print(B_link)
        New_url = large_url + B_link
        #print(New_url)
        download_photo(New_url , B_link , )
def main():
   print("you should input tow number to request download some picture what you like:")
   num = input("请输入要下载煎蛋网妹子图的页数:(当前输入第一个数字)")
   num1 = input("请输入要下载煎蛋网妹子图的页数:(当前输入第二个数字)")
   for each in range(int(num) , int(num1)):
       get_page(each)
   print("下载完成!")
if __name__ == "__main__":
   main()

网上这代码能运行成功但是不知道图片放哪去了,真是奇怪

后续

说说这几天都干了什么吧,礼拜五的时候,五节c语言课基本把我时间耗完了。苦陷于链表不能自拔,虽然学校才教到循环结构,但我想把后面的难点给理解了。毕竟链表是数据结构的基础,也是重点,懂了链表,算是彻底入门c了。
当然咯,也只是把链表的创建和遍历完成了,途中上机课花了半个小时手打链表,结果一直有bug,可能是我不太懂visual c++的报错机制,错误不会具体将光标指定到你那一行,最后没成功就算了,下课直接吃饭去了。。。
周末的时候跟着社团去公园烧烤野炊,后面就都把时间花在python上了。

怎么讲呢,学习都是循序渐进的,我也不急。现在主要是培养自己对编程的热爱,以及养成每天写博客的好习惯。把这些遇到的困难都记录下来吧,以后回来看的时候肯定颇有感慨的。
还有就是我这样独立自学恐怕不会让我坚持太久,我必须去找一些志同道合的小伙伴一起走下去。尽管学校了气氛不是很好,但总还是有人的。
我现在还是最要提升自己的实力,想着以后有更多的交流成本。

这些天我也发现一些学习方法,比如长代码最好别敲,直接上网找源代码,运行成功后逐段分析,分析完后在脱稿自己打打看,错了在返回看,如此反复,最后对概念的理解会更深一点,也更容易产生兴趣,更容易在自己一个人的时候坚持下去吧。
然后对于一件事情,最好遇到挫折不要坚持超过一个小时,如果还是不成功的话会极大的消耗自己的热情。